POJ 3243 Clever Y (求解高次同余方程A^x=B(mod C) Baby Step Giant Step算法)
不理解Baby Step Giant Step算法,请戳:
http://www.cnblogs.com/chenxiwenruo/p/3554885.html
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#define SIZE 99991
/*
POJ 3243
AC
求解同余方程:
A^x=B(mod C)
*/
using namespace std;
struct HashTable{
int key[SIZE]; //对应A^i
int val[SIZE]; //对应i
void init(){
memset(key,-,sizeof(key));
memset(val,-,sizeof(val));
}
int hfind(int k){
int kk=k%SIZE;
while(key[kk]!=k && key[kk]!=-){
kk=(kk+)%SIZE; //原先写成了kk=(kk+1)&SIZE;导致一直TLE。。。
}
return val[kk];
}
void hinsert(int v,int k){
int kk=k%SIZE;
while(key[kk]!=- && key[kk]!=k){
kk=(kk+)%SIZE;
}
if(key[kk]==-){
key[kk]=k;
val[kk]=v;
}
}
}h; int gcd(int a,int b){
return b==?a:gcd(b,a%b);
}
int exgcd(int a,int b,int &x,int &y){
if(b==){
x=;
y=;
return a;
}
int d=exgcd(b,a%b,x,y);
int tmp=x;
x=y;
y=tmp-a/b*y;
return d;
} //求解ax=b(mod c),
int solvex(int a,int b,int c){
int x,y;
int d;
d=exgcd(a,c,x,y);
//注意这里要强制转换成long long,不然x*b会超出int范围
x=((long long)x*b%c+c)%c;
//x=((long long)x*(b/d)%(c/d)+c/d)%(c/d); //实际应该是这样,但由于传的参数D,B,C中,D、C互质,d=1。
return x;
}
long long quickPow(long long a,int b,int mod){
long long ret=%mod;
a=a%mod;
while(b){
if(b&)
ret=(ret*a)%mod;
a=(a*a)%mod;
b=b>>;
}
return ret;
}
int BabyStep(int A,int B,int C){
B=B%C; //注意这里先要将B对C取模
h.init();
int d=;
long long D=%C,buf=D;
for(int i=;i<=;buf=buf*A%C,++i){
if(buf==B)
return i;
}
int tmp;
while((tmp=gcd(A,C))!=){
if(B%tmp)
return -;
d++;
B=B/tmp;
C=C/tmp;
D=D*A/tmp%C;
}
int m=(int)ceil(sqrt((double)C));
buf=%C;
for(int i=;i<m;buf=buf*A%C,++i){
h.hinsert(i,(int)buf);
}
long long K=quickPow((long long)A,m,C);
for(int i=;i<m;D=D*K%C,++i){
int ans=solvex((int)D,B,C);
int j=h.hfind(ans);
if(j!=-)
return i*m+j+d;
}
return -;
}
int main()
{
int A,B,C;
while(scanf("%d%d%d",&A,&C,&B)!=EOF){
if(A== && B== && C==)
break;
int ans=BabyStep(A,B,C);
if(ans==-)
printf("No Solution\n");
else
printf("%d\n",ans);
}
return ;
}
该题和POJ 2417,HDU 2815 一样,代码稍微改改就能AC。
不过不同的是,HDU 2815 若B>=C,则要判断无解。而不是像POJ这两道题,要先B%C一下。
POJ 3243 Clever Y (求解高次同余方程A^x=B(mod C) Baby Step Giant Step算法)的更多相关文章
- POJ 3243 Clever Y 扩展BSGS
http://poj.org/problem?id=3243 这道题的输入数据输入后需要将a和b都%p https://blog.csdn.net/zzkksunboy/article/details ...
- POJ 3243 Clever Y | BSGS算法完全版
题目: 给你A,B,K 求最小的x满足Ax=B (mod K) 题解: 如果A,C互质请参考上一篇博客 将 Ax≡B(mod C) 看作是Ax+Cy=B方便叙述与处理. 我们将方程一直除去A,C的最大 ...
- poj 3243 Clever Y && 1467: Pku3243 clever Y【扩展BSGS】
扩展BSGS的板子 对于gcd(a,p)>1的情况 即扩展BSGS 把式子变成等式的形式: \( a^x+yp=b \) 设 \( g=gcd(a,p) \) 那么两边同时除以g就会变成: \( ...
- POJ 3243 Clever Y(离散对数-拓展小步大步算法)
Description Little Y finds there is a very interesting formula in mathematics: XY mod Z = K Given X, ...
- poj 3243 Clever Y 高次方程
1 Accepted 8508K 579MS C++ 2237B/** hash的强大,,还是高次方程,不过要求n不一定是素数 **/ #include <iostream> #inclu ...
- [POJ 3243]Clever Y
Description Little Y finds there is a very interesting formula in mathematics: XY mod Z = K Given X, ...
- POJ 3243 Clever Y Extended-Baby-Step-Giant-Step
题目大意:给定A,B,C,求最小的非负整数x,使A^x==B(%C) 传说中的EXBSGS算法0.0 卡了一天没看懂 最后硬扒各大神犇的代码才略微弄懂点0.0 參考资料: http://quarter ...
- 解高次同余方程 (A^x=B(mod C),0<=x<C)Baby Step Giant Step算法
先给出我所参考的两个链接: http://hi.baidu.com/aekdycoin/item/236937318413c680c2cf29d4 (AC神,数论帝 扩展Baby Step Gian ...
- 『高次同余方程 Baby Step Giant Step算法』
高次同余方程 一般来说,高次同余方程分\(a^x \equiv b(mod\ p)\)和\(x^a \equiv b(mod\ p)\)两种,其中后者的难度较大,本片博客仅将介绍第一类方程的解决方法. ...
随机推荐
- C# WPF使用ZXing生成二维码ImageSource
介绍: 如果需要实在WPF窗体程序中现类似如下的二维码图片生成功能,可以通过本文的方法实现 添加步骤: 1.在http://zxingnet.codeplex.com/站点上下载ZXing .Net的 ...
- C 封装一个csv 解析库
引言 最经关于基础C开发框架基本都搭建好了. 在研究githup,准备传上去. 可惜的是两会连githup 都登陆不进去. 三观很正的我也觉得, 这样不好. 双向标准, 共x党不是一个代表穷苦大众的党 ...
- 通过Maven搭建Mybatis项目
学习通过maven工程搭建Mybatis工程开启对M ybaits的学习总结之旅. 1.首先创建Maven工程. 2.在pom.xml文件中加入依赖的jar <!-- mybatis核心包 -- ...
- R 中安装xlsx包缺少java环境解决方案
1.安装Java程序(官网win7 64位系统的Java安装程序及网址http://www.java.com/zh_CN/download/manual.jsp),选择windows 64位脱机安装到 ...
- Android里面的命名规范
前前后后接触安卓也有一段时间了,但是对于Android命名规范这块一直没有太注意过.导致有的时候写出来的代码,前后的风格根本不一样,今天在网上查了一下,正好对自己来说可以好好的总结一下. 首先在And ...
- 苹果HomeKit如何牵动全国智能硬件格局
苹果HomeKit如何牵动全国智能硬件格局 2014-06-23 15:48 发表 系统分类:消费电子 自定义分类:默认 标签:智能家居 苹果在6月的WWDC开发者大会上发布了包括 ...
- 使用 RestEasy 和 Apache Tomcat 构建 RESTful Web 服务
第一次,用这个RestEasy框架,用的时候,总是提示,404的错误,郁闷,呵呵,不过经过努力,终于解决问题,特别留个标记. 关于404的错误,上网找了一大堆,也还不行. 我感觉应该是lib下面架包的 ...
- 007--VS2013 C++ 显示位图半透明化
以后所有图片都放在根目录下: 如有另放,会特别注明 //全局变量HBITMAP bg,girl;HDC mdc; //起始坐标const int xstart = 50;const int ystar ...
- java数组元素的输出
java数组元素的输出 利用Arrays.toString(数组名即可) String[] name = {"Tom", "John", "Nike& ...
- SpringMVC核心类DispatcherServlet
配置DispatcherServlet 要使用SpringMVC,必须在web.xml中配置好这个DispatcherServlet类 <!-- spring框架必须定义ContextLoade ...