数学证明
ax + by = gcd(a,b)
令gcd(a,b) = d
得:ax + by = d ①
因为:gcd(a,b) = gcd(b,a%b)
所以:bx + a%b * y = d
bx + (a-[a/b] * b) * y = d???? 注:[ ]是向下取整的意思
整理得:bx + ay - [a/b] * by = d
ay + b(x - [a/b] * y) = d ②
由①和②得:
1 . x = y
2. y = x - [a/b] * y = x - [a/b] * x
?
边界:
当b=0时,ax + by = gcd(a,b) = a
ax = a ==> x = 1
by = 0 ==> y = 0
?
综上:
x = 1, ? y = 0???? (b=0)
x = y,?? y = y-[a/b] * x (或写成y-=[a/b]*x)???? (b!=0)
代码实现
void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
{
if(b==0)
{
d = a;
x = 1;
y = 0;
}
else
{
exgcd(b,a%b,d,y,x);
y -= x*(a/b);
}
}
注意:x y 需要引用操作
老规矩,上一道例题收个尾!
给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的。
Input
输入2个数M, N中间用空格分隔(1 <= M < N <= 10^9)
Output
输出一个数K,满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的。
Sample Input
2 3
Sample Output
2
AC代码如下:
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
{
if(b==0)
{
d = a;
x = 1;
y = 0;
}
else
{
exgcd(b,a%b,d,y,x);
y -= x*(a/b);
}
}
int main()
{
ll m,n,k;
cin>>m>>n;
ll x,y,d;
exgcd(m,n,d,x,y);
k = (x%n+n)%n;
cout<<k<<endl;
}
最后,感谢您的阅读!!!
因为,约还没有赴,你还没有见着,事还没有成。所以,为之千千万万遍努力。
?
|