洛谷 P1082 [NOIP2012 提高组] 同余方程(exgcd)
传送门
发现自己数论+文化课数学都已经炸了,所以从头学起补一补,以后要多刷数论题了。
解题思路
\(ax\equiv 1\pmod{b}\)
可以转换成 \(ax+by=1\)
而答案就是这个方程的解中x的最小正整数解。
直接用exgcd算出一组解\(x_0\),然后想办法得到x的最小正整数。
我们回到题目:
输入数据保证一定有解
怎么保证的?
根据裴蜀定理可以得出,1是a和b的gcd的倍数。
很显然,1就是a和b的gcd,即ab互质。
我们把\(x_0\)%b,一定也满足条件,所以最终答案就是 (\(x_0\)%b+b)%b,(防止负数)
AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<ctime>
using namespace std;
long long a,b,x,y;
void exgcd(int a,int b){
if(b==0){
x=1;
y=0;
return;
}
exgcd(b,a%b);
swap(x,y);
y=y-a/b*x;
}
int main(){
cin>>a>>b;
exgcd(a,b);
cout<<(x%b+b)%b;
return 0;
}
markdown我爱了
//NOIP2012 day2t1