1. 程式人生 > >bsgs

bsgs

std insert logs tin next i++ blog names fine

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<math.h> 
#include<map> 
#define LL long long
using namespace std;
LL a,b,c,m,f[1200000];
map<LL,int> mp;
LL    qsm(LL x)
{
    LL sum=1
,aa=a%c; while(x>0) { if( x%2 ) sum=(sum*aa)%c; x=x>>1; aa=(aa*aa)%c; } return sum; } int main() { mp.clear(); while(scanf("%lld%lld%lld",&c,&a,&b)!=EOF) { mp.clear(); if(!(a%c)) { printf(
"no solution\n"); continue; } int p=false; m=ceil(sqrt((double)c)); LL ans; for(int i=0;i<=m;i++) { if(i==0) { ans=b%c; mp[ans]=i; continue;//? } ans
=(ans*a)%c; mp[ans]=i; } LL t=qsm(m);ans=1; for(int i=1;i<=m;i++) { ans=(ans*t)%c; if(mp[ans]) { int t=i*m-mp[ans]; printf("%d\n",(t%c+c)%c); p=true; break; } } if(!p) printf("no solution\n"); } return 0; }

HASH

// poj2417
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define LL long long
#define inf (1ll<<29)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std;
 
const int M=1000007;
struct Hash {int w,id,next;}h[1000010];
int head[M],cnt;
 
void insert(LL x,int I) {
    int id=x%M;
    h[++cnt]=(Hash){x,I,head[id]};head[id]=cnt;
}
int find(LL x) {
    int id=x%M;
    if (!head[id]) return -1;
    for (int i=head[id];i;i=h[i].next) if (h[i].w==x) return h[i].id;
    return -1;
}
LL power(LL a,LL b,LL p) {
    LL res=1;
    while (b) {
        if (b&1) (res*=a)%=p;
        b>>=1;(a*=a)%=p;
    }
    return res;
}
LL BSGS(LL a,LL b,LL p) {
    int m=sqrt(p);
    memset(head,0,sizeof(head));
    insert(1,0);
    LL inv=power(a,p-1-m,p),e=1;
    for (int i=1;i<=m;i++) {
        e=e*a%p;
        if (find(e)==-1) insert(e,i);
    }
    for (int i=0;i*m<p;i++) {
        int x=find(b);
        if (x!=-1) return x+i*m;
        b=b*inv%p;
    }
    return -1;
}
int main() {
    LL p,a,b;
    while (scanf("%lld%lld%lld",&p,&a,&b)!=EOF) {
        LL ans=BSGS(a,b,p);
        if (ans==-1) puts("no solution");
        else printf("%lld\n",ans);
    }
    return 0;
}

bsgs