求关于x的同余方程 ax≡1(mod b) 的最小正整数解。

对于 100%的数据,2≤a,b≤2*109

NOIP 2012 提高组 第二天 第一题

(只看Exgcd的自行跳过这段文字)
先撇开扩展欧几里得什么的不管,首先证明辗转相除法。
gcd(greatest common divisor),是一种计算两个数最大公约数的算法,时间复杂度为O(1)。简单来说,我们定义gcd(a,b)为a、b的最大公约数,那么gcd(a,b)=gcd(b,a mod b)。一般使用递归计算,在最后一层,a≡0(mod b)的时候,这一层的b即为答案。
下面给出证明:
令a>b,则存在正整数k、r,使得a=kb+r,而r≡a(mod b),所以我们要证明的结论就是gcd(a,b)=gcd(b,r)。
若r=0,那么以上结论显然。
那么,若r≠0呢?
假设gcd(a,b)=d,那么存在正整数p、q,使得a=pd,b=qd(p>q)。
所以pd=kqd+r,整理得r=(p-kq)d。因为r>0,所以pd>kqd,显然p-kq为正整数,所以r必为d的倍数,不难证明gcd(a,b)=gcd(b,r),也就是gcd(a,b)=gcd(b,a mod b)。
  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. using namespace std;
  4.  
  5. LL a,b;//不开long long见祖宗
  6.  
  7. LL gcd(LL a,LL b)
  8. {
  9. if(b==) return a;
  10. return gcd(b,a%b);
  11. }
  12. int main(){
  13. scanf("%d%d",&a,&b);
  14. printf("%lld",gcd(a,b));
  15. return ;
  16. }
踏入正题~
问题是求解同余方程 ax≡1(mod b) 的最小正整数解。
将问题转化一下,这个方程的实质是ax+by=1(其中y为整数)。
扩欧求的是ax+by=gcd(a,b)的解。
那显然,这里的gcd(a,b)=1,所以这里a,b互质。
 
扩展欧几里得算法~前置知识:辗转相除法。
对于ax+by=gcd,输入中已经给了a、b我们只要求出一组x,y解,满足x是无数组解中最小的正整数。
假设我们求出了另一组数x2、y2,使得bx2+(a mod b)y2=gcd(b,a mod b),则因为gcd(a,b)=gcd(b,a mod b),所以bx2+(a mod b)y2=gcd(a,b);
联立等式,得到ax+by=bx2+(a mod b)y2
我们可以将a mod b转化成a-(a/b)*b。
所以ax+by=bx2+(a-(a/b)*b)y2
ax+by=ay2-b(x2-(a/b)y2)
解得x=y2,y=x2​−(a/b)y2。
对于等式bx2+(a mod b)y2=gcd(b,a mod b),我们再观察等式ax+by=gcd(a,b)。发现两个等式本质上是相同的,可得依次推出x3,y3,x4,y4……
直到最后一组b=0时,解得x=1,y=任意整数,当然,y最好取0,有可能会数值越界。
另外,x还要进行最后的处理,x=(x%b+b)%b就做到了x为最小正整数解,想想为什么?
  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4.  
  5. int a,b,x,y;
  6.  
  7. void Exgcd(int a,int b)
  8. {
  9. if(b==)
  10. {
  11. x=,y=;//最终的x、y
  12. return;
  13. }
  14. Exgcd(b,a%b);
  15. int tmp=x;
  16. x=y;//更新上一层x
  17. y=tmp-(a/b)*y;//更新上一层y
  18. }
  19. signed main()//main函数不能为long long
  20. {
  21. scanf("%lld%lld",&a,&b);
  22. Exgcd(a,b);
  23. x=(x%b+b)%b;//最小正整数解
  24. cout<<x<<endl;
  25. return ;
  26. }

数学题多手算模拟几遍就理解了~

gcd 和 同余方程(Exgcd)的更多相关文章

  1. NOIP2012同余方程[exgcd]

    题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开 输出格式: 输出只有一行,包含一个正整 ...

  2. 洛谷 P1082 同余方程 —— exgcd

    题目:https://www.luogu.org/problemnew/show/P1082 用 exgcd 即可. 代码如下: #include<iostream> #include&l ...

  3. 洛谷 1082 同余方程——exgcd(水题)

    题目:https://www.luogu.org/problemnew/show/P1082 大水题. #include<iostream> #include<cstdio> ...

  4. 扩展gcd codevs 1200 同余方程

    codevs 1200 同余方程 2012年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description 求关 ...

  5. 一本通1632【 例 2】[NOIP2012]同余方程

    1632:[ 例 2][NOIP2012]同余方程 时间限制: 1000 ms         内存限制: 524288 KB [题目描述] 求关于 x 的同余方程 ax≡1(mod b) 的最小正整 ...

  6. 模板—扩展GCD*2

    有必要重新学一下扩展GCD emmmm. 主要是扩展GCD求解线性同余方程$ax≡b (mod p)$. 1.方程有解的充分必要条件:b%gcd(a,p)=0. 证明: $ax-py=b$ 由于求解整 ...

  7. 礼物(中国剩余定理+拓展gcd求逆元+分治=拓展Lucus)

    礼物 题意: 求\[C(n,m)\ \%\ p\] \(n,m,p\le 10^9\),且若\(p=\prod_{i=1}^{k}{p_i}^{c_i}\),则\(\forall i\in [1..k ...

  8. 扩展gcd codevs 1213 解的个数

    codevs 1213 解的个数  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 已知整数x,y满足如下面的条件: ax+by ...

  9. [luoguP1082] 同余方程(扩展欧几里得)

    传送门 ax≡1(mod b) 这个式子就是 a * x % b == 1 % b 相当于 a * x - b * y == 1 只有当 gcd(a,b) == 1 时才有解,也就是说 ax + by ...

随机推荐

  1. 十代雅阁广东车友群,雅阁广州车友群,深圳雅阁车友群,雅阁微信群、雅阁车友群、十代雅阁交流微信QQ群

    最近一直在关注第十代雅阁,不论是普通汽油版本还是油电混动版本都很不错,在网上看到很多评测文章和视频 后续都会整理发布到微信群中. 由于论坛发帖,博客发文都不是很方便,为了及时沟通,先创建了微信群,方便 ...

  2. 各类最短路算法基本模板-C++

    原文转自:https://blog.csdn.net/changjiale110/article/details/77394650 感谢. #define Max 0x3f3f3f3f #define ...

  3. Java多线程下载器FileDownloader(支持断点续传、代理等功能)

    前言 在我的任务清单中,很早就有了一个文件下载器,但一直忙着没空去写.最近刚好放假,便抽了些时间完成了下文中的这个下载器. 介绍 同样的,还是先上效果图吧. Jar包地址位于 FileDownload ...

  4. c++小游戏——三国杀

    #include<iostream> #include<time.h> #include<stdio.h> #include <stdlib.h> us ...

  5. 深入了解数据校验:Bean Validation 2.0(JSR380)

    每篇一句 > 吾皇一日不退役,尔等都是臣子 对Spring感兴趣可扫码加入wx群:`Java高工.架构师3群`(文末有二维码) 前言 前几篇文章在讲Spring的数据绑定的时候,多次提到过数据校 ...

  6. 开源一个好用的nodejs访问mysql类库

    一.背景问题 自nodejs诞生以来出现了一大批的web框架如express koa2 egg等等,前端可以不再依赖后端可以自己控制服务端的逻辑.原来的后端开发同学的阵地前端如今同样也写的风生水起,撸 ...

  7. Excel催化剂开源第11波-动态数组函数技术开源及要点讲述

    在Excel催化剂中,大量的自定义函数使用了动态数组函数效果,虽然不是原生的Excel365版效果(听说Excel2019版取消了支持动态数组函数,还没求证到位,Excel365是可以用,但也仅限于部 ...

  8. python整型-浮点型-字符串-列表及内置函数(上)

    整型 简介 # 是否可变类型: 不可变类型 # 作用:记录年龄.手机号 # 定义: age = 18 # --> 内部操作 age = int(18) # int('sada') # 报错 in ...

  9. 如何在Eclipse中查看Java类库的源代码

    你的JDK安装目录下%Java_home%/src.zip文件就是源码,解压缩找到对应包下面的类即可. 如果是Eclipse开发,ctr+鼠标左击,出现不了源码的话,在弹出的视图中点击attach s ...

  10. 小白学python-day05(2)-列表及其操作

    今天是day05(2),以下是学习总结 但行努力,莫问前程. --------------------------------------------------------------------- ...