[Sdoi2013]随机数生成器(BSGS)
Posted 神犇(shenben)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Sdoi2013]随机数生成器(BSGS)相关的知识,希望对你有一定的参考价值。
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<map> using namespace std; typedef long long ll; struct Thash{ static const int MOD=233333; static const int MAXN=1e6+5; int tot,head[MOD+100],next[MAXN],h[MAXN],val[MAXN]; inline void clear(){tot=0;memset(head,0,sizeof head);} inline void insert(int H,int VAL){ for(int i=head[H%MOD];i;i=next[i]) if(h[i]==H){val[i]=VAL;return ;} next[++tot]=head[H%MOD];head[H%MOD]=tot;h[tot]=H;val[tot]=VAL; } inline int get(int H){ for(int i=head[H%MOD];i;i=next[i]) if(h[i]==H) return val[i]; return 0; } }M; int T; ll p,a,b,x1,t; inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<\'0\'||ch>\'9\'){if(ch==\'-\')f=-1;ch=getchar();} while(ch>=\'0\'&&ch<=\'9\'){x=x*10+ch-\'0\';ch=getchar();} return x*f; } ll fpow(ll a,ll p,ll mod){ ll res=1; for(;p;p>>=1,a=a*a%mod) if(p&1) res=res*a%mod; return res; } void exgcd(ll a,ll b,ll &d,ll &x,ll &y){ if(!b){d=a;x=1;y=0;return ;} exgcd(b,a%b,d,y,x); y-=x*(a/b); } ll BSGS(ll A,ll B,ll mod){ A%=mod; if(!A){ if(!B) return 1; return -1; } ll m=sqrt(mod)+1,ni=fpow(A,mod-m-1,mod); ll t=1,y=1; M.clear(); M.insert(1,m+1); for(int i=1;i<m;i++){ t=t*A%mod; if(!M.get(t)) M.insert(t,i); } for(int i=0;i<m;i++){ int u=M.get(B*y%mod); if(u){ if(u==m+1) u=0; return i*m+u; } y=y*ni%mod; } return -1; } ll calc1(){ ll z=(t-x1+p)%p,d,x,y; exgcd(b,p,d,x,y); if(z%d) return -1;z/=d; x=x*z%p; if(x<0) x+=p; return x+1; } ll calc2(){ ll c=fpow(a-1,p-2,p),A=(x1+b*c)%p,z=(b*c+t)%p,d,x,y; exgcd(A,p,d,x,y); if(z%d) return -1;z/=d; if(x<p) x=x%p+p; d=BSGS(a,x*z%p,p); if(~d) return d+1; return -1; } ll solve(){ if(x1==t) return 1; if(!a){ if(b==t) return 2; else return -1; } if(a==1) return calc1(); return calc2(); } int main(){ freopen("random.in","r",stdin); freopen("random.out","w",stdout); for(T=read();T--;){ p=read();a=read();b=read();x1=read();t=read(); printf("%lld\\n",solve()); } return 0; }
以上是关于[Sdoi2013]随机数生成器(BSGS)的主要内容,如果未能解决你的问题,请参考以下文章
BZOJ 3122 [Sdoi2013]随机数生成器 (BSGS)