• 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
    ");
                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
    ",(t%c+c)%c);
                    p=true;
                    break;
                }
            }
            if(!p)
                printf("no solution
    ");
        }
        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
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    Redis总结(六)Redis配置文件全解
    Thrift总结(二)创建RPC服务
    Thrift总结(一)介绍
    C#总结(三)DataGridView增加全选列
    C#总结(二)事件Event 介绍总结
    Quartz.NET总结(六)了解Jobs 和 Triggers
    C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步)
    Redis总结(五)缓存雪崩和缓存穿透等问题
    C#类和成员的修饰符
    sqlserver 修改替换text,ntext类型字段的两种方案
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/6915356.html
Copyright © 2020-2023  润新知