洛谷 P1082 [NOIP2012 提高组] 同余方程(exgcd)

传送门


发现自己数论+文化课数学都已经炸了,所以从头学起补一补,以后要多刷数论题了。

解题思路

(axequiv 1pmod{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

原文地址:https://www.cnblogs.com/yinyuqin/p/14747655.html