首页 > 代码库 > bsgs

bsgs

#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