同余方程

时间限制: 1 Sec  内存限制: 128 MB

题目描述

求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解。

输入

输入只有一行,包含两个正整数 a, b,用一个空格隔开。

输出

输出只有一行,包含一个正整数 x0,即最小正整数解。输入数据保证一定有解。

 

样例输入

复制样例数据

3 10

样例输出

7

提示

对于 100%的数据,2 ≤a, b≤ 2,000,000,000。

ax≡1(mod b) -> ax%b - 1%b≡0,因为b大于2,所以ax%b=1,马上想到ax=by+1,即ax-by=1,这不就是扩展欧几里德吗?

把a求出来,因为a有可能为负的,但题目要正的,那么怎么办呢,可以问by借点(x+mb)a+b(y-ma)=1还是成立的,所以只要在x上加m倍的b就行了。

/**/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>

typedef long long LL;
using namespace std;

LL a, b;
LL ans;

void ex_gcd(LL a, LL b, LL &x, LL &y){
	if(!b){
		x = 1, y = 0;
		return ;
	}
	ex_gcd(b, a % b, y, x);
	y -= x * (a / b);
}

int main()
{
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);

	scanf("%lld %lld", &a, &b);
	LL x, y;
	ex_gcd(a, b, x, y);
	while(x < 0) x += b;
	printf("%lld\n", x);

	return 0;
}
/**/