zoukankan      html  css  js  c++  java
  • 问题 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;
    }
  • 相关阅读:
    IOS实现自动循环滚动广告--ScrollView的优化和封装
    iOS开发知识点总结
    iOS项目常用效果方法注意点集锦
    项目功能大全,让你的项目一天搞定
    Xcode调试技巧(断点和重构)
    Swift学习笔记-ARC
    常用的属性修饰
    __ block
    小笔记
    java+tomcat安装
  • 原文地址:https://www.cnblogs.com/LJB666/p/11010343.html
Copyright © 2011-2022 走看看