问题 A: 同余方程-NOIP2012TGD2T1
时间限制: 1 Sec 内存限制: 128 MB
献花: 20 解决: 16
[献花][花圈][TK题库]
题目描述
求关于x的同余方程ax≡1(mod b)的最小正整数解。
输入格式
每组输入数据只有一行,包含两个正整数a, b,用一个空格隔开。
数据规模:
对于40%的数据,2≤b≤1,000;
对于60%的数据,2≤b≤50,000,000;
对于100%的数据,2≤a, b≤2,000,000,000。
输出
每组输出只有一行,包含一个正整数x0,即最小正整数解。输入数据保证一定有解。
样例输入
3 10
样例输出
7
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <cstring>
#include <string>
using namespace std;
typedef long long LL;
/*
对ax + by = gcd(a,b)进行求解
a*1 + 0 * 0 = gcd(b,a%b)显然成立
ax + by = gcd(a,b)
bx1 + (a%b)y1 = gcd(b ,a % b) 并且显然gcd(a,b) = gcd (b,a % b)
ax + by = bx1 + (a%b)y1
又:a%b = a - (a/b) * b 这里的a/b与计算机自动向下取整一致
则:ax + by = bx1 + (a - (a/b)*b)y1
得:ax + by = ay1 + b(x1 - (a/b)y1)
得:x = y1
y = x1 - (a/b)y1
*/
LL exGcd(LL a, LL b, LL &x, LL &y)
{
if (b == 0)
{
x = 1;
y = 0;
return a;
}
LL gcd = exGcd(b, a%b, x, y); // x1 y1
LL tmp = x;//x1;
x = y; // x = y1;
y = tmp - (a / b) * y;//y = x1 - (a/b)y1;
return gcd;
}
/*
ax = 1(mod b)
等价于求 ax + by = 1 如果方程有解则一定有gcd = 1
*/
int main()
{
#ifdef _DEBUG
freopen("data.txt", "r+", stdin);
#endif // _DEBUG
LL x, y;
LL a, b;
while (cin >> a >> b)
{
LL gcd = exGcd(a, b, x, y);
cout << (x % b / gcd + b / gcd) % (b / gcd) << endl;
}
return 0;
}