d. 式子B^L=N(mod P),给出B、N、P,求最小的L。
s.下面解法是设的im-j,而不是im+j。
设im+j的话,貌似要求逆元什么鬼
c.
/* POJ 2417,3243 baby step giant step a^x=b(mod n) n是素数或不是素数都可以 求解上式 0<=x<n的解 */ #include<iostream> #include<stdio.h> #include<string.h> #include<math.h> using namespace std; #define MOD 76543 int hs[MOD],head[MOD],next[MOD],id[MOD],top; void insert(int x,int y){ int k=x%MOD; hs[top]=x,id[top]=y,next[top]=head[k],head[k]=top++; } int find(int x){ int k=x%MOD; for(int i=head[k];i!=-1;i=next[i]) if(hs[i]==x) return id[i]; return -1; } int BSGS(int a,int b,int n){ memset(head,-1,sizeof(head)); top=1; if(b==1)return 0; int m=sqrt(n*1.0),j; long long x=1,p=1; for(int i=0;i<m;++i,p=p*a%n)insert(p*b%n,i); for(long long i=m;;i+=m){ if((j=find(x=x*p%n))!=-1)return i-j; if(i>n)break; } return -1; } int main(){ int P,B,N; int ans; while(~scanf("%d%d%d",&P,&B,&N)){ ans=BSGS(B,N,P); if(ans==-1){ printf("no solution "); } else{ printf("%d ",ans); } } return 0; }
参考:http://www.cnblogs.com/yuiffy/p/3877381.html
http://www.cnblogs.com/kuangbin/archive/2013/08/24/3278852.html