#include<bits/stdc++.h>#define int long long usingnamespacestd;inta,p,b;unordered_map<int,int>mp;intqpow(inta,intn,intmod){intans=1;while(n){if(n&1)ans=ans*a%mod;a=a*a%mod;n>>=1;}returnans;}intbsgs(inta,intb,intp){a%=p;b%=p;if(1==b%p)return0;//特判结果为0的情况intm=ceil(sqrt(p));intbaj=1;for(inti=0;i<=m;i++){if(i==0){baj=b%p;mp[baj]=i;continue;}baj*=a;baj%=p;mp[baj]=i;}intam=qpow(a,m,p);inttmp=1;for(inti=1;i<=m;i++)//由于假设n为i*m-j,若i从0开始枚举则有可能输数 {tmp*=am;tmp%=p;if(mp.count(tmp))returni*m-mp[tmp];}return-1;}signedmain(){cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);while(cin>>a>>p>>b){mp.clear();if(a==0&&p==0&&b==0)break;intans=bsgs(a,b,p);if(ans==-1)cout<<"No Solution"<<endl;elsecout<<ans<<endl;}return0;}
扩展BSGS
解题步骤
1.当\(a\)与\(p\)互质时,套用普通BSGS即可
2.当\(a\)与\(p\)不互质时,设\(gcd\)为\(a\)与\(p\)的最大公约数,对于方程\(a^n=b ( mod \ p ) (,一定有 \(a/gcd * a^{n-1} = b/gcd ( mod\ p/gcd )\)存在,因此若\)b\)不为\(gcd\)的倍数,则方程无解
#include<bits/stdc++.h>usingnamespacestd;#define int long long constintinf=1e8;inta,p,b,x,y;intqpow(inta,intn,intmod){intans=1;while(n){if(n&1)ans=ans*a%mod;a=a*a%mod;n>>=1;}returnans;}intexgcd(inta,intb,int&x,int&y){if(!b){x=1;y=0;returna;}intans=exgcd(b,a%b,x,y);inttmp=x;x=y;y=tmp-(a/b)*y;returnans;}unordered_map<int,int>mp;intbsgs(inta,intb,intp){mp.clear();a=a%p;//b=(b%p+p)%p; if(1%p==b%p)return0;//特判结果为0的情况 intm=ceil(sqrt(p));intbaj=1;for(inti=0;i<=m;i++){if(i==0){baj=b%p;mp[baj]=i;continue;}baj*=a;baj%=p;mp[baj]=i;}intam=qpow(a,m,p);inttmp=1;for(inti=1;i<=m;i++){tmp*=am;tmp%=p;if(mp.count(tmp))returni*m-mp[tmp];}return-1;}intexbsgs(inta,intb,intp){b=(b%p+p)%p;//令b为正if(1%p==b%p)return0;intgcd=exgcd(a,p,x,y);if(gcd>1){if(b%gcd)return-inf;exgcd(a/gcd,p/gcd,x,y);inta2=a;intb2=b/gcd*x%(p/gcd);intp2=p/gcd;returnexbsgs(a2,b2,p2)+1;}returnbsgs(a,b,p);}signedmain(){ios::sync_with_stdio(0);while(cin>>a>>p>>b){if(!a&&!b&&!p)break;intans=exbsgs(a,b,p);if(ans<0)cout<<"No Solution"<<endl;elsecout<<ans<<endl;}return0;}
#include<bits/stdc++.h>usingnamespacestd;#define int long long intm,k;unordered_map<int,int>mp;intexgcd(inta,intb,int&x,int&y){if(b==0){x=1;y=0;returna;}intans=exgcd(b,a%b,x,y);inttmp=x;x=y;y=tmp-(a/b)*y;returnans;}intqpow(inta,intn,intmod){intans=1;while(n){if(n&1)ans=ans%mod*a%mod;a=a%mod*a%mod;n>>=1;}returnans;}intbsgs(inta,intb,intp){a%=p;b%=p;intm=ceil(sqrt(p));inttmp;for(inti=0;i<=m;i++){if(i==0){tmp=b%p;mp[tmp]=i;continue;}tmp*=a;tmp%=p;mp[tmp]=i;}intam=qpow(a,m,p);intnow=1;for(inti=1;i<=m;i++){now*=am;now%=p;//cout<<"now="<<now<<endl; if(mp.count(now)&&i*m-mp[now]==0)continue;//特判结果为0的elseif(mp.count(now))returni*m-mp[now];}return-1;}intx,y;signedmain(){cin>>m>>k;intgcd=exgcd(m,k,x,y);if(gcd!=1){cout<<"Let's go Blue Jays!"<<endl;return0;}intans=bsgs(k,1,m);if(ans==-1)cout<<"Let's go Blue Jays!"<<endl;elsecout<<ans<<endl;return0;}