学习一个大步小步求离散对数
来源:互联网 发布:linux安装suse11 编辑:程序博客网 时间:2024/06/05 22:29
Hash 实现
idy的板子十分的漂亮
#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;#define S 100007struct Hash_Map{ int head[S],nxt[S],dest[S][2],tot; void init() { memset(head,-1,sizeof(head)); tot=0; } void add(int a,int b) { int key=a%S; for(int i=head[key];~i;i=nxt[i]) if(dest[i][0]==a) return; dest[++tot][0]=a; dest[tot][1]=b; nxt[tot]=head[key]; head[key]=tot; } int find(int a) { int key=a%S; for(int i=head[key];~i;i=nxt[i]) if(dest[i][0]==a) return dest[i][1]; return -1; }}hash;void exgcd(int a,int b,int &d,int &x,int &y){ if(b==0){d=a;x=1;y=0;} else { int xx,yy; exgcd(b,a%b,d,xx,yy); x=yy; y=xx-(a/b)*yy; }}int inverse(int a,int m){ int d,x,y; exgcd(a,m,d,x,y); return (x%m+m)%m;}int ind(int a,int b,int m) { int c=(int)ceil(sqrt(m) + 1); hash.init(); int cur=1; for(int i=0;i<c;i++,cur=(1LL*cur*a)%m) { hash.add(cur,i); if(b==cur) return i; } int base=inverse(cur,m); cur=1LL*b*base%m; for(int i=c;i<=m;i+=c,cur=(1LL*cur*base)%m) { int j=hash.find(cur); if(j!=-1) return c+j; } return -1;}int main(){ int a,b,m; scanf("%d%d%d",&a,&b,&m); printf("%d\n",ind(a,b,m));}
阅读全文
0 0
- 学习一个大步小步求离散对数
- Summer Training day4 Mod Tree 大步小步法求离散对数模板
- 求离散对数
- hdu 2815 大步小步
- Shank大步小步算法
- Poj2417 大步小步算法
- 浅谈大步小步算法
- BSGS算法学习小记(大步小步算法)
- UVA 11916 Emoogle Grid(大步小步算法(解模方程对数) 快速幂 模的逆)
- hdu2815扩展小步大步攻击
- POJ 2417 大步小步算法
- POJ 3243 大步小步算法
- 【bzoj2480】Mod 扩展大步小步
- uva 11916 大步小步算法
- 大步小步算法 (BSGS算法)
- 离散化+树状数组 求逆序对数
- 大步小步法解决离散对数问题 by——miskcoo
- UVA11916 Emoogle Grid 网格涂色 大步小步算法(解模方程对数) 快速幂 模的逆 模的对数
- 学习SpringMVC——SpringMVC框架的运行原理
- rest风格超简单案例
- pom.xml项目文件中出现web.xml is missing and <failOnMissingWebXml> is set to true解决方法
- 设计模式——代理模式及在jdk中的应用
- String.intern()探究
- 学习一个大步小步求离散对数
- java 日期时间格式控制及转化
- 获取控件的宽高
- jenkins发布普通javaweb项目到tomcat
- .Net Mvc+Easyui 分页
- 【POJ2942】Knights of the Round Table-点双连通分量+判断奇环
- python基础学习-python的json
- cogs577. 蝗灾(CDQ)
- Query on a graph HDU5957 沈阳ICPC重现赛