洛谷 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

posted @ 2021-05-09 12:43  尹昱钦  阅读(85)  评论(0编辑  收藏  举报