### 2.gcd和exgcd

gcd就是所谓的辗转相除法，在这里用取模的形式体现出来

$$gcd(a,b)$$，因为b中的a对答案没有贡献，考虑把b变成$$b-(b/a)*a$$答案是一样的

exgcd就是解线性方程$$ax+by=c$$

$$ax+by=gcd(a,b)=gcd(b,a\%b)=bx'+(a\%b)y'$$

$$ax+by=bx'+ay'-(a/b)*b*y'$$

$$x = x' + b/gcd(a,b)*t$$

$$y = y' - a/gcd(a,b)*t$$

### 3.BSGS

$$a^x=b(mod\ c)$$，给出a，b，c求x

//Author: dream_maker
#include<bits/stdc++.h>
using namespace std;
//----------------------------------------------
//typename
typedef long long ll;
//convenient for
#define fu(a, b, c) for (int a = b; a <= c; ++a)
#define fd(a, b, c) for (int a = b; a >= c; --a)
#define fv(a, b) for (int a = 0; a < (signed)b.size(); ++a)
//inf of different typename
const int INF_of_int = 1e9;
const ll INF_of_ll = 1e18;
//fast read and write
template <typename T>
void Read(T &x) {
bool w = 1;x = 0;
char c = getchar();
while (!isdigit(c) && c != '-') c = getchar();
if (c == '-') w = 0, c = getchar();
while (isdigit(c)) {
x = (x<<1) + (x<<3) + c -'0';
c = getchar();
}
if (!w) x = -x;
}
template <typename T>
void Write(T x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) Write(x / 10);
putchar(x % 10 + '0');
}
//----------------------------------------------
int y, z, P;
int add(int a, int b) {
return (a += b) >= P ? a - P : a;
}
int sub(int a, int b) {
return (a -= b) < 0 ? a + P : a;
}
int mul(int a, int b) {
return 1ll * a * b % P;
}
int fast_pow(int a, int b) {
int res = 1;
while (b) {
if (b & 1) res = mul(res, a);
b >>= 1;
a = mul(a, a);
}
return res;
}
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
void exgcd(int a, int b, ll &x, ll &y) {
if (!b) {x = 1, y = 0; return;}
exgcd(b, a % b, y, x);
y -= a / b * x;
}
void work1() {
Write(fast_pow(y, z));
putchar('\n');
}
void work2() {
int g = gcd(y, P);
if (z % g) {
printf("Orz, I cannot find x!\n");
} else {
ll a, b;
exgcd(y, P, a, b);
a *= z / g;
a = (a % (P / g) + P / g) % (P / g);
Write(a);
putchar('\n');
}
}
map<int, int> mp;
void work3() {
y %= P, z %= P;
if (!y) {
printf("Orz, I cannot find x!\n");
return;
}
int w = sqrt(P), now = z;
mp.clear();
fu(i, 0, w) {
mp[now] = i;
now = mul(now, y);
}
now = fast_pow(y, w);
int tmp = now;
fu(i, 1, w) {
if (mp.count(tmp)) {
Write(i * w - mp[tmp]);
putchar('\n');
return;
}
tmp = mul(tmp, now);
}
printf("Orz, I cannot find x!\n");
}
int main() {
int T, op;
if (op == 1) while (T--) work1();
else if (op == 2) while (T--) work2();
else while (T--) work3();
return 0;
}


## 从BZOJ2242看数论基础算法：快速幂，gcd，exgcd，BSGS的更多相关文章

1. 【BZOJ4002】[JLOI2015]有意义的字符串（数论，矩阵快速幂）

[BZOJ4002][JLOI2015]有意义的字符串(数论,矩阵快速幂) 题面 BZOJ 洛谷 题解 发现我这种题总是做不动... 令$$A=\frac{b+\sqrt d}{2},B=\frac{ ... 2. 【BZOJ2432】【NOI2011】兔农（数论，矩阵快速幂） [BZOJ2432][NOI2011]兔农(数论,矩阵快速幂) 题面 BZOJ 题解 这题\(75$$分就是送的,我什么都不想写. 先手玩一下,发现每次每次出现$$mod\ K=1$$的数之后 把它减 ...

3. 数论基础算法总结（python版）

/* Author: wsnpyo Update Date: 2014-11-16 Algorithm: 快速幂/Fermat, Solovay_Stassen, Miller-Rabin素性检验/E ...

4. Java 算法-快速幂

1 什么是快速幂? 快速幂,顾名思义就是快速的求次幂,例如:a^b,普通的算法就是累乘,这样的计算方法的时间复杂度就是O(n),而快速幂的方法使得次幂的计算方法的时间复杂度降低到O(logn).  假 ...

5. ACM | 算法 | 快速幂

目录 快速幂 快速幂取模 矩阵快速幂 矩阵快速幂取模 HDU1005练习 快速幂 ​ 幂运算:$$x ^ n$$ ​ 根据其一般定义我们可以简单实现其非负整数情况下的函数 定义法: int Pow ( ...

6. 【POJ 1845】Sumdiv——数论 质因数 + 分治 + 快速幂

(题面来自luogu) 题目描述 输入两个正整数a和b,求a^b的所有因子之和.结果太大,只要输出它对9901的余数. 输入格式 仅一行,为两个正整数a和b(0≤a,b≤50000000). 输出格式 ...

7. 【数论】【快速幂】CODEVS 2952 细胞分裂 2

裸快速幂取模,背诵模板用. #include<cstdio> using namespace std; typedef long long LL; LL n=,m,q; LL Quick_ ...

8. 【数论】【快速幂】bzoj1008 [HNOI2008]越狱

根据 高中的数学知识 即可推出 ans=m^n-m*(m-1)^(n-1) .快速幂取模搞一下即可. #include<cstdio> using namespace std; typed ...

9. ACM学习历程—HDU5667 Sequence（数论 &amp;&amp; 矩阵乘法 &amp;&amp; 快速幂）

http://acm.hdu.edu.cn/showproblem.php?pid=5667 这题的关键是处理指数,因为最后结果是a^t这种的,主要是如何计算t. 发现t是一个递推式,t(n) = c ...

## 随机推荐

1. MVC上传文件

ASP.NET MVC上传文件是必段撑握的知识.加强训练才是.以前Insus.NET曾使用第三方MyAjaxForm.js :http://www.cnblogs.com/insus/p/378548 ...

2. linux命令：more

1.命令介绍: more用来逐页输出文件内容,空格键进入到下一页,b键返回到上一页. 2.命令格式: more [选项] 文件 3.命令参数 +n      从笫n行开始显示 -n       定义屏 ...

3. excel if判断时间段早晚班

=IF(OR(HOUR(B3)={9,10,11,12,13,14,15,16,17,18}),"早班","晚班")

4. 在VS中使用类模板出现出现LNK2019: 无法解析的外部符号错误。

在VS中使用类模板出现出现LNK2019: 无法解析的外部符号错误,应在一个.h文件中完成方法的声明与实现,不要将实现放在cpp文件里,VS貌似不支持类模板分离

5. HDU 1506 Largest Rectangle in a Histogram set+二分

Largest Rectangle in a Histogram Problem Description: A histogram is a polygon composed of a sequenc ...

6. HDU 3338 Kakuro Extension

网络最大流 TLE了两天的题目.80次Submit才AC,发现是刘汝佳白书的Dinic代码还可以优化.....瞬间无语..... #include<cstdio> #include< ...

7. GIT入门笔记（1）- Git的基本概念

一.概念和定义 1.git是什么 许多人习惯用复制整个项目目录的方式来保存不同的项目版本,或许还会改名加上备份时间以示区别.这么做唯一的好处就是简单.不过坏处也不少:有时候会混淆所在的工作目录,一旦弄 ...

8. Nginx http2.0

109/110 HTTP2.0协议 优势必须使用TLS加密 传输数据量大幅减少 1:以二进制格式传输  2:标头压缩(header做压缩) 多路复用及相关功能 : 消息优先级 (比如样式表先渲染页面那 ...

9. NLB网路负载均衡管理

相对于ARR来说,ARR算是应用级别的负载均衡方案,而NLB则是服务器级别的负载均衡方案.ARR只能做请求入口的消息分发服务,这样如果我们的消息分发服务器给挂掉,那么做再多的应用服务集群也都枉然. A ...

10. 数据库类型总结对比（Java，Hibernate，SQLServer，MySQL，Oracle）