GCD模板

__int64 gcd(__int64 a,__int64  b)
{return b==0? a:gcd(b,a%b);
}

欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:

  gcd函数就是用来求(a,b)的最大公约数的。

  gcd函数的基本性质:

  gcd(a,b)=gcd(b,a)=gcd(-a,b)=gcd(|a|,|b|)

证明:

基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)。

第一种证明:

a可以表示成a = kb + r,则r = a mod b

  假设d是a,b的一个公约数,则有

  d|a, d|b,而r = a - kb,因此d|r

  因此d是(b,a mod b)的公约数

  假设d 是(b,a mod b)的公约数,则

  d | b , d |r ,但是a = kb +r

  因此d也是(a,b)的公约数

  因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。

第二种证法:

第二种证明:

要证欧几里德算法成立,即证: gcd(a,b)=gcd(b,r),其中 gcd是取最大公约数的意思,r=a mod b
    下面证 gcd(a,b)=gcd(b,r)
    设  c是a,b的最大公约数,即c=gcd(a,b),则有 a=mc,b=nc,其中m,n为正整数,且m,n互为质数
    由 r= a mod b可知,r= a- qb 其中,q是正整数,
    则 r=a-qb=mc-qnc=(m-qn)c
    b=nc,r=(m-qn)c,且n,(m-qn)互质(假设n,m-qn不互质,则n=xd, m-qn=yd 其中x,y,d都是正整数,且d>1
                                                                则a=mc=(qx+y)dc, b=xdc,这时a,b 的最大公约数变成dc,与前提矛盾,
                                                                 所以n ,m-qn一定互质)
    则gcd(b,r)=c=gcd(a,b)
    得证。

扩展欧几里德定理

  对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整

  数对 x,y ,使得 gcd(a,b)=ax+by。

证明:

基本算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。

证明:设 a>b。

  1,显然当 b=0,gcd(a,b)=a。此时 x=1,y=0;

  2,ab!=0 时

  设 ax1+by1=gcd(a,b);

  bx2+(a mod b)y2=gcd(b,a mod b);

  根据朴素的欧几里德原理有 gcd(a,b)=gcd(b,a mod b);

  则:ax1+by1=bx2+(a mod b)y2;

  即:ax1+by1=bx2+(a-(a/b)*b)y2=ay2+bx2-(a/b)*by2;

  根据恒等定理得:x1=y2; y1=x2-(a/b)*y2;

这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2.

   上面的思想是以递归定义的,因为 gcd 不断的递归求解一定会有个时候 b=0,所以递归可以结束。

以上来自 这篇博客 具体应用可以继续看这篇文章

模板

int exgcd(int a,int b,int &x,int &y)
{if(b == 0){x = 1; y = 0; return a;}int d = exgcd(b, a % b,x,y);int temp = x;x = y;y = temp - a / b * y;return d;
}

快速幂取模

http://blog.csdn.net/hkdgjqr/article/details/5381292

快速幂取模就是在O(logn)内求出a^n mod b的值。算法的原理是ab mod c=(a mod c)(b mod c)mod c

二分递归

long exp_mod(long a,long n,long b)
{long t;if(n==0) return 1%b;if(n==1) return a%b;t=exp_mod(a,n/2,b);t=t*t%b;if((n&1)==1) t=t*a%b;return t;
}

基于二进制

LL q_mod(LL a,LL b)
{
LL d,t;
d = 1,t=a;
while(b)
{
if(b&1) d = (d*t)%mod;
b/=2;
t = (t*t)%mod;
}
return d;
}

http://acm.hdu.edu.cn/showproblem.php?pid=2817

View Code

 1 #include<stdio.h>
 2 #define N 200907
 3 __int64 exp_mod(__int64 a,__int64 b)
 4 {
 5     __int64 d,t;
 6     d = 1;
 7     t = a;
 8     while(b>0)
 9     {
10         if(b%2==1)
11             d = d*t%N;
12         b=b/2;
13         t = t*t%N;
14     }
15     return d;
16 }
17 int main()
18 {
19     __int64 n,m,a1,a2,a3,d,s,x;
20     int i,j,k,t;
21     scanf("%d", &t);
22     while(t--)
23     {
24         scanf("%I64d%I64d%I64d%d",&a1,&a2,&a3,&k);
25         if(a2-a1==a3-a2)
26         {
27             d = a3-a2;
28             s = (a1%N+d*(k-1)%N)%N;
29             printf("%I64d\n",s);
30         }
31         else
32         {
33             x = a3/a2;
34             printf("%I64d\n",(a1*exp_mod(x,k-1))%N);
35         }
36     }
37     return 0;
38 }

转载于:https://www.cnblogs.com/shangyu/archive/2012/08/02/2620595.html

(扩展)欧几里德快速幂相关推荐

  1. 第二十七章 数论——快速幂与逆元

    第二十七章 快速幂与扩展欧几里德算法 一.快速幂 1.使用场景 2.算法思路 (1)二进制优化思想 (2)模运算法则 3.代码实现 (1)问题 (2)代码 二.快速幂求逆元 1.什么是逆元? (1)同 ...

  2. 快速幂 (转载,详细)

    本文转载的,觉得比较详细 快速幂取模算法 在网站上一直没有找到有关于快速幂算法的一个详细的描述和解释,这里,我给出快速幂算法的完整解释,用的是C语言,不同语言的读者只好换个位啦,毕竟读C的人较多~ 所 ...

  3. BC#29A:GTY's math problem(math) B:GTY's birthday gift(矩阵快速幂)

    A: HDU5170 这题让比较a^b与c^d的大小.1<=a,b,c,d<=1000. 显然这题没法直接做,要利用对数来求,但是在math库中有关的对数函数返回的都是浮点数,所以这又要涉 ...

  4. AtCoder AGC019E Shuffle and Swap (DP、FFT、多项式求逆、多项式快速幂)

    题目链接 https://atcoder.jp/contests/agc019/tasks/agc019_e 题解 tourist的神仙E题啊做不来做不来--这题我好像想歪了啊= =-- 首先我们可以 ...

  5. 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)

    先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...

  6. (组合数求模=乘法逆元+快速幂) Problem Makes Problem

    题目: As I am fond of making easier problems, I discovered a problem. Actually, the problem is 'how ca ...

  7. 求解斐波那契第n项的几种解法(含矩阵乘法+快速幂) Python实现

    斐波那契数列 首先我们来定义一下斐波那契数列: f(n)={0n = 01n = 1f(n−1)+f(n−2)n > 1f(n)= \begin{cases} 0 & \text {n ...

  8. Codeforces 1106F Lunar New Year and a Recursive Sequence 矩阵快速幂,原根转化模意义下对数,BSGS

    文章目录 题意 题解 对数法转指数线性递推 原根与模意义下求对数 拔山盖世! 最终步骤 Problem Origin 狠搞了一个多星期,做出来之后仍然一知半解,写个博客重理思路. 题意 定义序列fff ...

  9. 欧拉定理、快速幂与逆元

    Color the necklace 时间限制:2000 ms  |  内存限制:65535 KB 难度:0 描述 As we all know, girls love necklaces, espe ...

最新文章

  1. 快速序列化组件MessagePack介绍
  2. javafx透明边框_JavaFX技巧6:使用透明颜色
  3. java中的gui_java gui快速入门教程
  4. 同一个闭区间上有界变差函数的和与积都是有界变差函数
  5. c语言的单行注释范围,c语言中的注释,multi-line comment
  6. [转]Terraform 使用 - 从最简单例子开始
  7. Collectors.collectingAndThen()
  8. 我的kindle书单
  9. javacv 视频增加水印
  10. AD之PCB快速选中所有元器件并锁定
  11. python上传数据到坚果云_坚果云功能
  12. 泛函分析 笔者一学期整理 感谢朱老师
  13. php kb转换成字节,将kB换算为MB (千字节换算为兆字节)
  14. 谁说淘宝客不赚钱?用此招,票子流量手到擒来!
  15. 阿里财报中的饿了么:守正出奇
  16. spyder pyecharts不显示_后期剪辑还在升级主机配置?换台京东方显示器才最重要...
  17. 火狐浏览器插件开发小试
  18. USB摄像头图片采集+QT显示(二)
  19. Cocos2D教程:使用SpriteBuilder和Cocos2D 3.x开发横版动作游戏——Part 2
  20. 闪存颗粒SLC、MLC、TLC、QLC

热门文章

  1. 带头结点头部插入创建链表
  2. POJ 1521 Entropy
  3. mysql 横向排列,mysql横向转纵向、纵向转横向排列的方法
  4. SAS宏技术中,%let和call symput有什么区别?
  5. [MySQL]经常无故崩溃amd.dll , boot1.exe病毒
  6. 在python中是否可以使用if作为变量名_在Python中可以使用if 作为变量名_python使用符号 标示注释...
  7. java循环输入直到,使用循环接受其他用户输入,直到用户输入结束输入的值
  8. 【算法图解|3】JavaScript 如何实现数组去重
  9. 我是如何使用git把本地代码上传到github上的,值得借鉴
  10. 插入文件找不到桌面了?