• 问题 G: 【一本通提高同余问题】计算器


    模板题,最重要的是BSGS算法

    #include<bits/stdc++.h>
    using namespace std;
    long long T,K,opt;
    long long yy,z,p,ans1,ans2,ans3;
    long long newans;
    long long x,y;
    long long Quickpow(long long x,long long n,long long mod)
    {
        long long base=1;
        while(n)
        {
            if(n&1)
            {
                base=(long long)base*x%mod;
            }
            n>>=1;
            x=x*x%mod;
        }
        return base;
    }
    long long Exgcd(long long a,long long &x,long long b,long long &y)
    {
        if(b==0)
        {
            x=1;
            y=0;
            return a;
        }
        long long Gcd=Exgcd(b,x,a%b,y);
        long long tmp;
        tmp=x;
        x=y;
        y=tmp-(a/b)*y;
        return Gcd;
    }
    long long BSGS(long long a,long long b,long long p)
    {
        map<long,long>hash;
        hash.clear();
        b%=p;
        int t=(int)sqrt(p)+1;
        for(int j=0;j<t;j++)
        {
            int val=(long long)b*Quickpow(a,j,p)%p;
            hash[val]=j;
        }
        a=Quickpow(a,t,p);
        if(a==0)
        {
            if(b==0)
            {
                return 1;
            }
            else
            {
                return -1;
            }
        }
        for(int i=0;i<=t;i++)
        {
            int val=(int)Quickpow(a,i,p);
            int j=hash.find(val)==hash.end()?-1:hash[val];
            if(j>=0&&i*t-j>=0)
            {
                return i*t-j;
            }
        }
        return -1;
    }
    int main()
    {
        scanf("%lld%lld",&T,&K);
        while(T--)
        {
            if(K==1)
            {
                cin>>yy>>z>>p;
                ans1=Quickpow(yy,z,p);
                cout<<ans1<<endl;
            }
            else if(K==2)
            {
                cin>>yy>>z>>p;
                ans2=Exgcd(yy,x,p,y);
                if(z%ans2!=0)
                {
                    printf("Orz, I cannot find x!
    ");
                    continue;
                }
                else
                {
                    newans=((x*(z/ans2))%(p/ans2)+(p/ans2))%(p/ans2);
                }
                cout<<newans<<endl;
            }
            else if(K==3)
            {
                cin>>yy>>z>>p;
                ans3=BSGS(yy,z,p);
                if(ans3==-1)
                {
                    printf("Orz, I cannot find x!
    ");
                    continue;
                }
                else
                {
                    cout<<ans3<<endl;
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    asp.net中ashx文件如何调用session
    NetAdvantage webdatagrid 控件的一些属性
    .NET 配置文件简单使用
    Dictionary的遍历和修改
    利用html+ashx实现aspx的功能
    .ashx
    jQuery AJAX实现调用页面后台方法
    用JS实现AJAX
    WCF系列学习5天速成
    介绍一个小工具 Linqer
  • 原文地址:https://www.cnblogs.com/LJB666/p/11010343.html
Copyright © 2020-2023  润新知