求关于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)。
 #include<bits/stdc++.h>
#define LL long long
using namespace std; LL a,b;//不开long long见祖宗 LL gcd(LL a,LL b)
{
if(b==) return a;
return gcd(b,a%b);
}
int main(){
scanf("%d%d",&a,&b);
printf("%lld",gcd(a,b));
return ;
}
踏入正题~
问题是求解同余方程 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为最小正整数解,想想为什么?
 #include<bits/stdc++.h>
#define int long long
using namespace std; int a,b,x,y; void Exgcd(int a,int b)
{
if(b==)
{
x=,y=;//最终的x、y
return;
}
Exgcd(b,a%b);
int tmp=x;
x=y;//更新上一层x
y=tmp-(a/b)*y;//更新上一层y
}
signed main()//main函数不能为long long
{
scanf("%lld%lld",&a,&b);
Exgcd(a,b);
x=(x%b+b)%b;//最小正整数解
cout<<x<<endl;
return ;
}

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

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. ElasticStack学习(八):ElasticSearch索引模板与聚合分析初探

    一.Index Template与Dynamic Template的概念 1.Index Template:它是用来根据提前设定的Mappings和Settings,并按照一定的规则,自动匹配到新创建 ...

  2. QRowTable表格控件(二)-红涨绿跌

    目录 一.开心一刻 二.概述 三.效果展示 四.任务需求 五.指定列排序 六.排序 七.列对其方式 八.相关文章 原文链接:QRowTable表格控件(二)-红涨绿跌 一.开心一刻 一天,五娃和六娃去 ...

  3. 倍增求LCA学习笔记(洛谷 P3379 【模板】最近公共祖先(LCA))

    倍增求\(LCA\) 倍增基础 从字面意思理解,倍增就是"成倍增长". 一般地,此处的增长并非线性地翻倍,而是在预处理时处理长度为\(2^n(n\in \mathbb{N}^+)\ ...

  4. Hive的基本操作和数据类型

    Hive的基本操作 1.启动Hive bin/hive 2.查看数据库 hive>show databases; 3. 打开默认数据库 hive>use default; 4.显示defa ...

  5. 从草图绘制到实施交付:优秀API设计完整流程

    设计好的API是一项繁复的工作,但是优秀的设计是可以通过人为规划实现的,在本文中,我们将研究什么是好的设计以及如何在开发过程中实现它,还将介绍API设计的三个重要阶段:草图绘制,原型设计和交付实施,最 ...

  6. Docker部署web环境之Lanmp

    1. 案例一 整套项目多容器分离通过docker-compose部署lanmp环境 中方文档参考网址: docker/kubernets网址 http://www.dockerinfo.net/doc ...

  7. 不为人知的easy-mock-cli

    初识easy-mock-cli,始于一场缘分 在谈及easy-mock-cli的时候,先说一下easy-mock是什么把?官方解释是:Easy Mock 是一个可视化,并且能快速生成 模拟数据 的持久 ...

  8. Anacodna之conda的使用

    yum install -y bunzip2 wget https://repo.continuum.io/archive/Anaconda2-5.0.1-Linux-x86_64.sh chmod ...

  9. ESP-8266 RTOS 环境搭建

    本节为 ESP-8266 RTOS 的环境搭建 只适合Linux环境,推荐Ubuntu.本例以Ubuntu16.04-x64为例 安装 git [dzlua@ubuntu: ~]$ sudo apt ...

  10. TensorFlow神经网络机器学习使用详细教程,此贴会更新!!!

    运行 TensorFlow打开一个 python 终端: $ python >>> import tensorflow as tf >>> hello = tf.c ...