传送门

题目描述

已知数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 (大步小步)的更多相关文章

  1. BSGS 扩展大步小步法解决离散对数问题 (BZOJ 3239: Discrete Logging// 2480: Spoj3105 Mod)

    我先转为敬? orz% miskcoo 贴板子 BZOJ 3239: Discrete Logging//2480: Spoj3105 Mod(两道题输入不同,我这里只贴了3239的代码) CODE ...

  2. BSGS&EXBSGS 大手拉小手,大步小步走

    大步小步走算法处理这样的问题: A^x = B (mod C) 求满足条件的最小的x(可能无解) 其中,A/B/C都可以是很大的数(long long以内) 先分类考虑一下: 当(A,C)==1 即A ...

  3. 离散对数&&大步小步算法及扩展

    bsgs algorithm ax≡b(mod n) 大步小步算法,这个算法有一定的局限性,只有当gcd(a,m)=1时才可以用 原理 此处讨论n为素数的时候. ax≡b(mod n)(n为素数) 由 ...

  4. 大步小步算法模板题, poj2417

    大步小步模板 (hash稍微有一点麻烦, poj不支持C++11略坑) #include <iostream> #include <vector> #include <c ...

  5. [模板]大步小步算法——BSGS算法

    大步小步算法用于解决:已知A, B, C,求X使得 A^x = B (mod C) 成立. 我们令x = im - j | m = ceil(sqrt(C)), i = [1, m], j = [0, ...

  6. 离散对数及其拓展 大步小步算法 BSGS

    离散对数及其拓展 离散对数是在群Zp∗Z_{p}^{*}Zp∗​而言的,其中ppp是素数.即在在群Zp∗Z_{p}^{*}Zp∗​内,aaa是生成元,求关于xxx的方程ax=ba^x=bax=b的解, ...

  7. 【模板】exBSGS/Spoj3105 Mod

    [模板]exBSGS/Spoj3105 Mod 题目描述 已知数\(a,p,b\),求满足\(a^x\equiv b \pmod p\)的最小自然数\(x\). 输入输出格式 输入格式: 每个测试文件 ...

  8. 【bzoj2480】Spoj3105 Mod

    2480: Spoj3105 Mod Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 557  Solved: 210[Submit][Status][ ...

  9. 【题解】Matrix BZOJ 4128 矩阵求逆 离散对数 大步小步算法

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4128 大水题一道 使用大步小步算法,把数字的运算换成矩阵的运算就好了 矩阵求逆?这么基础的线 ...

随机推荐

  1. obj-c部分对象快捷赋值和取值

    NSNumber: NSNumber *number = @1234; 旧的方式: NSArray *physicsValues = [NSArrayarrayWithObjects: [NSNumb ...

  2. [poj 3539] Elevator (同余类bfs)

    Description Edward works as an engineer for Non-trivial Elevators: Engineering, Research and Constru ...

  3. MYSQL存储过程初步认知

    存储过程(Stored Procedure): 一组可编程的函数,是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行. 优点:将重 ...

  4. jQuery点击图片放大显示原图效果

    HTML部分:<div id="append_parent"></div> JS代码部分: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

  5. jenkins 自动化部署

    Execute shell Command BUILD_ID=DONTKILLMEif [ ! -d "/usr/jenkins/$JOB_NAME" ]; then mkdir ...

  6. ZOJ 2316 Matrix Multiplication

    Matrix Multiplication Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged on ZJU. O ...

  7. 编译打包部署 Dubbo Admin

    1.下载,Dubbo地址: https://github.com/alibaba/dubbo/tree/2.5.x ,直接ZIP下载 2.解压并打开项目,mvn package 得到war包,如下图: ...

  8. V$PROCESS和V$SESSION,以及使用这两个视图能做什么

    V$PROCESS和V$SESSION,以及使用这两个视图能做什么 http://blog.csdn.net/pan_tian/article/details/7731843 http://blog. ...

  9. Class example in C/C++

    class Player {  private:   int health; //these are the attributes   int strength;   int agility;  pu ...

  10. 前端 自定义format函数

    为字符串创建format方法,用于字符串格式化  {# 前端没有字符串占位符%s的替代方法,以下是自定义字符串替换的方法,以后前端拓展方法都可以使用下面的形式 #} String.prototype. ...