码迷,mamicode.com
首页 > 编程语言 > 详细

UVA 11916 Emoogle Grid 离散对数 大步小步算法

时间:2016-04-16 00:41:34      阅读:340      评论:0      收藏:0      [点我收藏+]

标签:

LRJ白书上的题

技术分享
#include <stdio.h>
#include <iostream>
#include <vector>
#include <math.h>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <string.h>
#include <string>
using namespace std;
typedef long long LL;
const LL mod=1e8+7;
const int N=505;

LL n,m,k,b,r,x[N],y[N];
set<pair<LL,LL> >bset;
void exgcd(LL a,LL b,LL& d,LL &x,LL &y){
    if(!b){d=a;x=1;y=0;}
    else {exgcd(b,a%b,d,y,x);y-=x*(a/b);}
}
LL pow_mod(LL a,LL p){
    LL ans=1;
    while(p){
        if(p&1)ans=(ans*a)%mod;
        p/=2;
        a=(a*a)%mod;
    }
    return ans;
}
LL inv(LL a){
    LL d,x,y;
    exgcd(a,mod,d,x,y);
    return d==1?(x+mod)%mod:-1;
}
LL log_mod(LL a,LL b){
    LL tmp,v,e=1;
    tmp=(LL)sqrt(mod+0.5);
    v=inv(pow_mod(a,tmp));
    map<LL,LL>mp;
    mp.clear();
    mp[1]=0;
    for(LL i=1;i<tmp;++i){
        e=(e*a)%mod;
        if(!mp.count(e))mp[e]=i;
    }
    for(LL i=0;i<tmp;++i){
        if(mp.count(b))return i*tmp+mp[b];
        b=(b*v)%mod;
    }
    return -1;
}
LL count(){
    LL c=0;
    for(LL i=0;i<b;++i)
     if(x[i]!=m&&!bset.count(make_pair(x[i]+1,y[i])))++c;
    c+=n;
    for(LL i=0;i<b;++i)if(x[i]==1)--c;
    return pow_mod(k,c)*pow_mod((k-1),n*m-b-c)%mod;
}
LL solve(){
    LL cnt=count();
    if(cnt==r)return m;
    LL c=0;
    for(LL i=0;i<b;++i)if(x[i]==m)++c;
    ++m;
    cnt=(cnt*pow_mod(k,c))%mod;
    cnt=(cnt*pow_mod(k-1,n-c))%mod;
    if(cnt==r)return m;
    return log_mod(pow_mod(k-1,n),(r*inv(cnt))%mod)+m;
}
int main()
{
    int T;
    scanf("%d",&T);
    for(int t=1;t<=T;++t){
        scanf("%lld%lld%lld%lld",&n,&k,&b,&r);
        bset.clear();
        m=1;
        for(LL i=0;i<b;++i){
            scanf("%lld%lld",&x[i],&y[i]);
            m=max(m,x[i]);
            bset.insert(make_pair(x[i],y[i]));
        }
        printf("Case %d: %lld\n",t,solve());
    }
    return 0;
}
View Code

 

UVA 11916 Emoogle Grid 离散对数 大步小步算法

标签:

原文地址:http://www.cnblogs.com/shuguangzw/p/5397263.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!