POJ - 2417 Discrete Logging(Baby-Step Giant-Step)
2016-03-11 21:22
489 查看
d. 式子B^L=N(mod P),给出B、N、P,求最小的L。
s.下面解法是设的im-j,而不是im+j。
设im+j的话,貌似要求逆元什么鬼
c.
View Code
参考:/article/6254926.html
http://www.cnblogs.com/kuangbin/archive/2013/08/24/3278852.html
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\n"); } else{ printf("%d\n",ans); } } return 0; }
View Code
参考:/article/6254926.html
http://www.cnblogs.com/kuangbin/archive/2013/08/24/3278852.html
相关文章推荐
- HDU 4276 概率dp+spfa
- nginx 域名映射
- poj1258(最小生成树)
- AlphaGo GITHUB
- DbUtils介绍和使用
- 架构师速成8.2-架构师要懂产品
- Maven Downloading
- 关于DNA 碱基序列检验的JAVA代码
- UIScrollView的简单使用
- DOM firstChild firstElementChiled
- 查找两个文件包含的字符串或不包含的字符串shell脚本
- WoWoViewPager 炫酷啊!
- AC自动机
- MatlabR2014a+Visual studio 2013 混合编程(都是 64位)
- 自组织神经网络介绍:自组织特征映射SOM(Self-organizing feature Map)
- Maximum Depth of Binary Tree
- 伸缩的菜单,用toggle()重写
- DOM offsetParent
- 高考志愿,你们想好怎么填了吗?
- Sublim 3中设置新的builid system