EXGCD - NOIP 2012 同余方程 - AcWing 203
求关于x的同余方程 ax ≡ 1(mod b) 的最小正整数解。
输入格式
输入只有一行,包含两个正整数a,b,用一个空格隔开。
输出格式
输出只有一行,包含一个正整数x,表示最小正整数解。
输入数据保证一定有解。
数据范围
2 ≤ a , b ≤ 2 ∗ 1 0 9 2≤a,b≤2∗10^9 2≤a,b≤2∗109
输入样例:
3 10
输出样例:
7
分析:
a x ≡ 1 ( m o d b ) < = > a x + b y = 1 , y ∈ Z 。 ax ≡ 1(mod \ b)\quad<=>\quad ax+by=1,y∈Z。 ax≡1(mod b)<=>ax+by=1,y∈Z。
数 据 保 证 有 解 , 则 必 有 g c d ( a , b ) = 1 , 数据保证有解,则必有gcd(a,b)=1, 数据保证有解,则必有gcd(a,b)=1,
否 则 a x + b y = 1 左 右 同 除 g c d ( a , b ) 发 现 等 式 右 侧 不 是 整 数 , 产 生 矛 盾 。 否则ax+by=1左右同除gcd(a,b)发现等式右侧不是整数,产生矛盾。 否则ax+by=1左右同除gcd(a,b)发现等式右侧不是整数,产生矛盾。
解 得 x = x 0 + k b g c d ( a , b ) = x 0 + b , 则 x 的 最 小 正 整 数 解 为 x 对 b 取 模 后 的 最 小 正 整 数 。 解得x=x_0+k\frac{b}{gcd(a,b)}=x_0+b,则x的最小正整数解为x对b取模后的最小正整数。 解得x=x0+kgcd(a,b)b=x0+b,则x的最小正整数解为x对b取模后的最小正整数。
代码:
#include<iostream>
using namespace std;
int exgcd(int a,int b,int &x,int &y)
{
if(!b)
{
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int main()
{
int a,b,x,y;
cin>>a>>b;
exgcd(a,b,x,y);
cout<<(x%b+b)%b<<endl;
return 0;
}