求关于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. Java中lambda表达式详解

    原文地址:http://blog.laofu.online/2018/04/20/java-lambda/ 为什么使用lambda 在java中我们很容易将一个变量赋值,比如int a =0;int ...

  2. 洛谷P1690 贪婪的Copy 题解

    题目:https://www.luogu.org/problemnew/show/P1690 分析: 这道题就是一道最短路的题目,因为看到数据范围: n≤100n\leq100n≤100 所以考虑使用 ...

  3. C#3.0新增功能09 LINQ 基础02 LINQ 查询简介

    连载目录    [已更新最新开发文章,点击查看详细] 查询 是一种从数据源检索数据的表达式. 查询通常用专门的查询语言来表示. 随着时间的推移,人们已经为各种数据源开发了不同的语言:例如,用于关系数据 ...

  4. hdu6406 Taotao Picks Apples(线段树)

    Taotao Picks Apples 题目传送门 解题思路 建立一颗线段树,维护当前区间内的最大值maxx和可摘取的苹果数num.最大值很容易维护,主要是可摘取的苹果数怎么合并.合并左右孩子时,左孩 ...

  5. SQL Server 保存特殊字符时乱码

    场景:协同完成的项目,数据库是同事创建,我们共同使用的表. 客户反应有一些字符查看的时候出现乱码.第一反应是否编码规则的问题.后来去数据库查发现数据库里就是乱码,百度了一下发现说特殊字符要保存在NVA ...

  6. 单调栈&单调队列

    最近打了三场比赛疯狂碰到单调栈和单调队列的题目,第一,二两场每场各一个单调栈,第三场就碰到单调队列了.于是乎就查各种博客,找单调栈,单调队列的模板题去做,搞着搞着发现其实这两个其实是一回事,只不过利用 ...

  7. request获取容器过程

    获取容器过程 CoyoteAdapter.postParseRequest(org.apache.coyote.Request req, Request request, org.apache.coy ...

  8. Java 内存模型详解

    概述 Java的内存模型(Java Memory Model )简称JMM.首先应该明白,Java内存模型是一个规范,主要规定了以下两点: 规定了一个线程如何以及何时可以看到其他线程修改过后的共享变量 ...

  9. Mysql优化(出自官方文档) - 第五篇

    目录 Mysql优化(出自官方文档) - 第五篇 1 GROUP BY Optimization 2 DISTINCT Optimization 3 LIMIT Query Optimization ...

  10. 【iOS】Assertion failure in -[MASViewConstraint install]

    刚遇到了这个问题,详细信息如下: Assertion failure 错误原因: 控件没有添加到视图就使用 mas_makeConstraints 了……应该先把控件添加到视图.