[luogu4195 Spoj3105] Mod (大步小步)
题目描述
已知数a,p,b,求满足a^x≡b(mod p)的最小自然数x。
输入输出格式
输入格式:
每个测试文件中最多包含100组测试数据。
每组数据中,每行包含3个正整数a,p,b。
当a=p=b=0时,表示测试数据读入完全。
输出格式:
对于每组数据,输出一行。
如果无解,输出“No Solution”(不含引号),否则输出最小自然数解。
输入输出样例
输入样例#1:
5 58 33
2 4 3
0 0 0
输出样例#1:
9
No Solution
说明
100%的数据,a,p,b≤1e9。
题解
大步小步模板
code:(在luogu不开氧气过不了QAQ)
#include<map>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
#define M(a,b) memset(a,(b),sizeof(a))
#define F(i,a,b) for(int i=(a);i<=(b);i++)
#define C(i,a,b) for(int i=(b);i>=(a);i--)
#define E(i,u) for(int i=head[u];i;i=nex[i])
using namespace std;
LL rd() {
LL x=0,f=1; char c=getchar();
while(!isdigit(c)) {if(c=='-') f=-f;c=getchar();}
while(isdigit(c)) x=(x<<3)+(x<<1)+c-48,c=getchar();
return x*f;
}
LL gcd(LL a,LL b) {return b?gcd(b,a%b):a;}
LL qpow(LL a,LL b,LL p) {
LL ans=1;
while(b) { if(b&1) ans=a*ans%p; a=a*a%p; b>>=1; }
return ans;
}
int BSGS(int a,int b,int p) {
a%=p,b%=p; if(b==1) return 0;
int cnt=0; LL t=1;
for(int g=gcd(a,p);g!=1;g=gcd(a,p)) {
if(b%g) return -1;
p/=g,b/=g; t=t*a/g%p; cnt++;
if(b==t) return cnt;
}
map <LL,int> M;
int m=int(sqrt(1.0*p)+1); LL tmp=b;
F(i,0,m) M[tmp]=i,tmp=tmp*a%p;
tmp=qpow(a,m,p);
LL now=t;
F(i,1,m+1) {
now=now*tmp%p;
if(M.count(now)) return i*m-M[now]+cnt;
}
return -1;
}
int main() {
int a,b,p;
while(~scanf("%d %d %d",&a,&p,&b)&&p) {
int ans=BSGS(a,b,p);
if(ans==-1) puts("No Solution");
else printf("%d\n",ans);
}
return 0;
}
[luogu4195 Spoj3105] Mod (大步小步)的更多相关文章
- BSGS 扩展大步小步法解决离散对数问题 (BZOJ 3239: Discrete Logging// 2480: Spoj3105 Mod)
我先转为敬? orz% miskcoo 贴板子 BZOJ 3239: Discrete Logging//2480: Spoj3105 Mod(两道题输入不同,我这里只贴了3239的代码) CODE ...
- BSGS&EXBSGS 大手拉小手,大步小步走
大步小步走算法处理这样的问题: A^x = B (mod C) 求满足条件的最小的x(可能无解) 其中,A/B/C都可以是很大的数(long long以内) 先分类考虑一下: 当(A,C)==1 即A ...
- 离散对数&&大步小步算法及扩展
bsgs algorithm ax≡b(mod n) 大步小步算法,这个算法有一定的局限性,只有当gcd(a,m)=1时才可以用 原理 此处讨论n为素数的时候. ax≡b(mod n)(n为素数) 由 ...
- 大步小步算法模板题, poj2417
大步小步模板 (hash稍微有一点麻烦, poj不支持C++11略坑) #include <iostream> #include <vector> #include <c ...
- [模板]大步小步算法——BSGS算法
大步小步算法用于解决:已知A, B, C,求X使得 A^x = B (mod C) 成立. 我们令x = im - j | m = ceil(sqrt(C)), i = [1, m], j = [0, ...
- 离散对数及其拓展 大步小步算法 BSGS
离散对数及其拓展 离散对数是在群Zp∗Z_{p}^{*}Zp∗而言的,其中ppp是素数.即在在群Zp∗Z_{p}^{*}Zp∗内,aaa是生成元,求关于xxx的方程ax=ba^x=bax=b的解, ...
- 【模板】exBSGS/Spoj3105 Mod
[模板]exBSGS/Spoj3105 Mod 题目描述 已知数\(a,p,b\),求满足\(a^x\equiv b \pmod p\)的最小自然数\(x\). 输入输出格式 输入格式: 每个测试文件 ...
- 【bzoj2480】Spoj3105 Mod
2480: Spoj3105 Mod Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 557 Solved: 210[Submit][Status][ ...
- 【题解】Matrix BZOJ 4128 矩阵求逆 离散对数 大步小步算法
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4128 大水题一道 使用大步小步算法,把数字的运算换成矩阵的运算就好了 矩阵求逆?这么基础的线 ...
随机推荐
- obj-c部分对象快捷赋值和取值
NSNumber: NSNumber *number = @1234; 旧的方式: NSArray *physicsValues = [NSArrayarrayWithObjects: [NSNumb ...
- [poj 3539] Elevator (同余类bfs)
Description Edward works as an engineer for Non-trivial Elevators: Engineering, Research and Constru ...
- MYSQL存储过程初步认知
存储过程(Stored Procedure): 一组可编程的函数,是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行. 优点:将重 ...
- jQuery点击图片放大显示原图效果
HTML部分:<div id="append_parent"></div> JS代码部分: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 ...
- jenkins 自动化部署
Execute shell Command BUILD_ID=DONTKILLMEif [ ! -d "/usr/jenkins/$JOB_NAME" ]; then mkdir ...
- ZOJ 2316 Matrix Multiplication
Matrix Multiplication Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged on ZJU. O ...
- 编译打包部署 Dubbo Admin
1.下载,Dubbo地址: https://github.com/alibaba/dubbo/tree/2.5.x ,直接ZIP下载 2.解压并打开项目,mvn package 得到war包,如下图: ...
- V$PROCESS和V$SESSION,以及使用这两个视图能做什么
V$PROCESS和V$SESSION,以及使用这两个视图能做什么 http://blog.csdn.net/pan_tian/article/details/7731843 http://blog. ...
- Class example in C/C++
class Player { private: int health; //these are the attributes int strength; int agility; pu ...
- 前端 自定义format函数
为字符串创建format方法,用于字符串格式化 {# 前端没有字符串占位符%s的替代方法,以下是自定义字符串替换的方法,以后前端拓展方法都可以使用下面的形式 #} String.prototype. ...