zoukankan      html  css  js  c++  java
  • BZOJ 3122 SDOI2013 随机数生成器

    一大堆边界一开始并不知道,胡乱判了几个之后一直WA

    无奈之下只好去下载了数据,然后就疯狂判各种奇怪的边界了

    刨去边界问题

    首先我们考虑a=1的情况

    x1+k*b=t(mod p)

    ex_gcd即可解

    考虑a>1的情况

    令S=X+b/(a-1)

    原式就变成了一个等比数列

    即S1*a^k=(t+b/(a-1))(mod p)

    移项之后BSGS解即可

    其他边界都可以O(1)判断

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<cstdlib>
    #include<map>
    #include<cmath>
    using namespace std;
     
    typedef long long LL;
    int T;
    LL p,a,b,x1,x,y,d,t,inv;
    map<LL,int>Q;
    void ex_gcd(LL a,LL b,LL &d,LL &x,LL &y){
        if(b==0){x=1;y=0;d=a;return;}
        ex_gcd(b,a%b,d,y,x);y-=(a/b)*x;
    }
    LL pow_mod(LL v,LL b){
        LL tmp=1;
        while(b){
            if(b&1)tmp=tmp*v%p;
            v=v*v%p;b>>=1;
        }return tmp;
    }
    LL log_mod(LL a,LL b,LL n){
        if(a==0&&b==0)return 1;
        if(a==0)return -1;
        LL m=(int)(sqrt(n+0.5))+1;Q.clear();
        LL v=pow_mod(a,m);v=pow_mod(v,n-2);
        LL e=1;Q[1]=0;
        for(int i=1;i<m;++i){
            e=e*a%n;
            if(!Q.count(e))Q[e]=i;
        }
        for(int i=0;i<m;++i){
            if(Q.count(b))return i*m+Q[b]+1;
            b=b*v%n;
        }return -1;
    }
     
    int main(){
        scanf("%d",&T);
        while(T--){
            scanf("%lld%lld%lld%lld%lld",&p,&a,&b,&x1,&t);
            if(x1==t){printf("1
    ");continue;}
            if(a==0){
                if(b==t){printf("2
    ");continue;}
                else {printf("-1
    ");continue;}
            }
            if(a==1){
                if(b==0){printf("-1
    ");continue;}
                ex_gcd(b,p,d,x,y);
                x1=(t-x1+p)%p;
                if(x1%d!=0){printf("-1
    ");continue;}
                x=x*x1;
                x=(x%p+p)%p;
                printf("%lld
    ",x+1);
                continue;
            }
            inv=pow_mod(a-1,p-2);
            b=b*inv%p;
            x1=(x1+b)%p;t=(t+b)%p;
            x1=pow_mod(x1,p-2);
            t=t*x1%p;
            printf("%lld
    ",log_mod(a,t,p));
        }return 0;
    }
    

      

  • 相关阅读:
    Java构造方法之间的调用
    JavaNote
    微信小程序-智能机器人
    微信小程序-今日头条案例
    微信小程序-记账本
    51job爬虫
    Xcode文件目录选中变成白色, 解决方案
    Mac通过以太网共享网络
    Mac系统Safari浏览器启动无图模式
    iOS9.0之后不支持http请求解决方案
  • 原文地址:https://www.cnblogs.com/joyouth/p/5392802.html
Copyright © 2011-2022 走看看