POJ 3243 离散对数-高次同余方程求解
来源:互联网 发布:淘宝网首页官网卖家 编辑:程序博客网 时间:2024/05/05 00:06
求离散对数 用的是小步大步算法 也就是babystep 算法结合hash 来处理的
#include <iostream>#include<cstdio>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define maxn 65535struct hash{ int a,b,next;} Hash[maxn*2];int flg[maxn+66];int top,idx;void ins(int a,int b){ int k=b&maxn; if(flg[k]!=idx) { flg[k]=idx; Hash[k].next=-1; Hash[k].a=a; Hash[k].b=b; return; } while(Hash[k].next!=-1) { if(Hash[k].b==b) return; k=Hash[k].next; } Hash[k].next=++top; Hash[top].next=-1; Hash[top].a=a; Hash[top].b=b;}int find(int b){ int k=b&maxn; if(flg[k]!=idx) return -1; while(k!=-1) { if(Hash[k].b==b) return Hash[k].a; k=Hash[k].next; } return -1;}int gcd(int a,int b){ return b==0?a:gcd(b,a%b);}int exgcd(int a,int b,int &x,int &y){ int t,ret; if(!b) { x=1,y=0; return a; } ret=exgcd(b,a%b,x,y); t=x,x=y,y=t-a/b*y; return ret;}int inval(int a,int b,int n){ int x,y,e; exgcd(a,n,x,y); e=(long long)x*b%n; return e<0? e+n:e;}int powmod(long long a,int b,int c){ long long ret=1%c; a%=c; while(b) { if(b&1) ret=ret*a%c; a=a*a%c; b>>=1; } return ret;}int babystep(int A,int B,int C){ top=maxn; ++idx; long long buf=1%C,D=buf,K; int i,d=0,tmp; for(i=0; i<=100; buf=buf*A%C,++i) if(buf==B) return i; while((tmp=gcd(A,C))!=1) { if(B%tmp) return -1; ++d; C/=tmp; B/=tmp; D=D*A/tmp%C; } int M=(int)ceil(sqrt((double)C)); for(buf=1%C,i=0; i<=M; buf=buf*A%C,++i) ins(i,buf); for(i=0,K=powmod((long long)A,M,C); i<=M; D=D*K%C,++i) { tmp=inval((int)D,B,C); int w; if(tmp>=0&&(w=find(tmp))!=-1) return i*M+w+d; } return -1;}int main(){ int a,b,c; while(~scanf("%d%d%d",&a,&b,&c)&&(a+b+c)) { c%=b; int tmp=babystep(a,c,b); if(tmp<0) puts("No Solution"); else printf("%d\n",tmp); } return 0;}
- POJ 3243 离散对数-高次同余方程求解
- poj 3243 Clever Y(离散对数-高次同余方程)
- POJ 2417 && POJ 3243 求解高次同余方程 BSGS
- poj 2417 baby_step giant_step 高次同余方程
- 高次同余笔记(三):离散对数和原根
- ACM_高次同余方程
- 高次同余方程:poj 3243+poj 2417+hdu 2815 (Baby Step Giant Step 算法)
- POJ 2417 Discrete Logging(高次同余方程-Baby-Step,Giant-Step)
- SGU 261 Discrete Roots(原根+高次同余方程+线性同余方程)
- Mod Tree(hdu2815高次线性同余方程)
- POJ3243 Clever Y【高次同余方程】
- POJ2417 Discrete Logging【高次同余方程】
- HDU2815 Mod Tree【高次同余方程】
- hdu 2815 Mod Tree(高次同余方程)
- POJ3243 Clever Y 解 高次同余方程
- HDU2815 Mod Tree 高次同余方程
- 高次同余方程(Baby-Step Giant-Step)
- hdu 2815 Mod tree 高次同余方程
- Windows socket之重叠IO:事件通知
- Incorrect column specifier for column 'addressId'
- 《誓言今生》收视夺冠 白庆琳上演“苦尽甘来”
- VC 一个函数实现listbox 水平滚动条
- backup email into local
- POJ 3243 离散对数-高次同余方程求解
- 《青春风暴》热拍 方泓仁携任容萱打造青春力作_0
- python2学习笔记 第三章 使用字符串
- Eclipse3.6与m2eclipse,run-jetty-run插件对WEB项目进行热部署以及在jar源码中进行调试(一)
- Notepad++配置C和C++编译器
- Eclipse3.6与m2eclipse,run-jetty-run插件对WEB项目进行热部署以及在jar源码中进行调试(二)
- 服务器启动关系
- linux 多线程
- 网页配色技巧