已知数a,p,b,求满足a^x≡b(mod p)的最小自然数x。
标签:
Orz zyf……然而他的题解对AC大神的题解作了引用……而坑爹的百度云……呵呵了。。。
扩展BSGS模板题
1 /************************************************************** 2 Problem: 2480 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:6948 ms 7 Memory:2212 kb 8 ****************************************************************/ 9 10 //BZOJ 2480 11 #include<cstdio> 12 #include<cmath> 13 #include<map> 14 #include<cstring> 15 #include<cstdlib> 16 #include<iostream> 17 #include<algorithm> 18 #define rep(i,n) for(int i=0;i<n;++i) 19 #define F(i,j,n) for(int i=j;i<=n;++i) 20 #define D(i,j,n) for(int i=j;i>=n;--i) 21 #define pb push_back 22 using namespace std; 23 typedef long long LL; 24 inline int getint(){ 25 int r=1,v=0; char ch=getchar(); 26 for(;!isdigit(ch);ch=getchar()) if (ch==‘-‘) r=-1; 27 for(; isdigit(ch);ch=getchar()) v=v*10-‘0‘+ch; 28 return r*v; 29 } 30 const int N=100010; 31 /*******************template********************/ 32 33 int a,p,b; 34 35 inline int gcd(int a,int b){return b ? gcd(b,a%b) : a;} 36 LL Pow(LL a,LL b,LL P){ 37 LL r=1; 38 for(;b;b>>=1,a=a*a%P) if (b&1) r=r*a%P; 39 return r; 40 } 41 map<int,int>mp; 42 int ex_BSGS(int a,int p,int b){ 43 int d=0,res=0,cnt=0; 44 LL t=0; 45 a%=p; b%=p; 46 for(int i=0,j=1;i<=50;i++,j=(LL)j*a%p) if (j==b) return i; 47 t=1%p; 48 49 while((d=gcd(a,p))!=1){ 50 if (b%d) return -1; 51 p/=d; b/=d; t=t*a/d%p; 52 ++cnt; 53 } 54 mp.clear(); 55 int m=ceil(sqrt(p)); 56 for(int i=0,j=1;i<m;i++,j=(LL)j*a%p) mp[(LL)b*j%p]=i; 57 a=Pow(a,m,p); 58 for(int i=0,j=t;i<=m;i++,j=(LL)j*a%p) 59 if (i && mp.count(j)) 60 return i*m-mp[j]+cnt; 61 return -1; 62 } 63 int main(){ 64 #ifndef ONLINE_JUDGE 65 freopen("2480.in","r",stdin); 66 freopen("2480.out","w",stdout); 67 #endif 68 int ans; 69 while(scanf("%d%d%d",&a,&p,&b)!=EOF && a && p && b){ 70 ans=ex_BSGS(a,p,b); 71 if (ans>=0) printf("%d\n",ans); 72 else puts("No Solution"); 73 } 74 return 0; 75 }
10%的数据,a,p,b≤10000;
对于另外30%的数据,p为质数;
100%的数据,a,p,b≤1e9。
标签:
原文地址:http://www.cnblogs.com/Tunix/p/4550145.html