求助,洛谷AC,但是 Atcoder WA

P3306 [SDOI2013] 随机数生成器

输出不一样啊,At里答案要 -1
by Konjac_16 @ 2022-09-27 20:39:49


@[Konjac_16](/user/538521) 呜。。。。挂错代码了。。。抱歉 [Code](https://www.luogu.com.cn/paste/00zkfaat)
by 淸梣ling @ 2022-09-27 20:41:50


不清楚,加了几个特判还是没过,可能是 bsgs 写挂了,比如哪块没取模之类的
by Konjac_16 @ 2022-09-27 21:04:52


@[Konjac_16](/user/538521) 矩阵能直接套 BSGS 的模板吗?
by 淸梣ling @ 2022-09-27 21:17:39


@[淸梣ling](/user/239192) 我是直接化的式子,然后直接用 bsgs
by Konjac_16 @ 2022-09-27 21:19:24


@[淸梣ling](/user/239192) 我没这么写过,不太清楚
by Konjac_16 @ 2022-09-27 21:19:49


```cpp #include <bits/stdc++.h> using namespace std; #define int long long #define mid ((l+r)>>1) // #define mod (998244353) #define eps (1e-9) #define mk make_pair #define For(i,a,b) for(int i=(a);i<=(b);++i) #define rep(i,a,b) for(int i=(a);i>=(b);--i) inline namespace IO{ inline int read(){ int x=0;int f=1;char ch; while((ch=getchar())<'0'||x>'9')if(ch=='-')f=-1; while(ch>='0'&&ch<='9'){x=((x<<1)+(x<<3)+(ch^48)),ch=getchar();} return x*f; } void write(char x){putchar(x);} void write(const char *x){for(;*x;++x)putchar(*x);} void write(char *x){for(;*x;++x)putchar(*x);} void write(signed x){ if(x<0)putchar('-'),x=-x; if(x>9)write(x/10); putchar('0'+x-x/10*10); } void write(long long x){ if(x<0)putchar('-'),x=-x; if(x>9)write(x/10); putchar('0'+x-x/10*10); } void write(unsigned long long x){ if(x>9)write(x/10); putchar('0'+x-x/10*10); } void write(double x){printf("%0.3lf",x);} void write(const string &s){cout<<s;} template<typename type1,typename type2,typename ...typen> void write(type1 a1,type2 a2,typen ...an){ write(a1); write(a2,an...); } }using namespace IO; inline int gcd(int x,int y){return y==0?x:gcd(y,x%y);} inline int lcm(int x,int y){return x/gcd(x,y)*y;} const int N=200005; int mod; inline int qpow(int a,int b){ int res=1; for(;b;b>>=1){ if(b&1)res=res*a%mod; a=a*a%mod; } return res; } unordered_map<int,int> mp; inline int bsgs(int a,int b){ mp.clear(); b%=mod; // write(a,' ',b,'\n'); int t=sqrt(mod-1)+1; For(i,0,t-1){ int v=b*qpow(a,i)%mod; mp[v]=i; } a=qpow(a,t); // if(!a)return b==0?1:-1; For(i,0,t){ int v=qpow(a,i); if(mp.find(v)==mp.end())continue; int j=mp[v]; if(j>=0&&i*t-j>=0)return i*t-j; } return -1; } inline void work(){ mod=read(); int A=read(),B=read(),S=read(),G=read(); if(S==G){write(0,'\n');return;} if(A==0){ if(G==B%mod)write(1,'\n'); else write(-1,'\n'); return; } if(A==1){ if(B==0){write(-1,'\n');return;} int res=(G-S+mod)%mod*qpow(B,mod-2)%mod; write(res,'\n'); return; } int Up=((A-1)*G+B)%mod; int Down=B+(A-1)*S%mod; // write(Up,' ',Down,'\n'); // if(Up%Down!=0){write(-1,'\n');return;} int res=bsgs(A,Up*qpow(Down,mod-2)); write(res,'\n'); } signed main() { // cout<<54%11<<'\n'; int T=read(); while(T--)work(); return 0; } /* 1 2 0 1 1 1 1 5 2 1 1 0 */ ```
by Konjac_16 @ 2022-09-27 21:20:13


@[淸梣ling](/user/239192) 感谢大佬的AT原题,洛谷的数据果然太水,连蒟蒻的垃圾代码都能过。\ 实测`a==1`(会使推导过程分母为0),`a==0`(会出现0的0次方),`/*分母*/%p==0`(逆元不存在)三个特判可以AC
by felixesintot @ 2023-08-11 23:02:48


|