题目描述
求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解。
输入输出格式
输入格式:输入只有一行,包含两个正整数 a, b,用一个空格隔开。
输出格式:输出只有一行,包含一个正整数 x0,即最小正整数解。输入数据保证一定有解。
输入输出样例
输入样例#1:
3 10
输出样例#1:
7
说明
【数据范围】
对于 40%的数据,2 ≤b≤ 1,000;
对于 60%的数据,2 ≤b≤ 50,000,000;
对于 100%的数据,2 ≤a, b≤ 2,000,000,000。
题目思路:
ax ≡ 1 (mod b) 即 ax%b = 1 变形后得到ax%b + by%b = 1 及 (ax + by) % b = 1 我们可以根据扩展欧几里德算法求得 ax + by = gcd(a,b)的通解。由通解求出题目的最小整数解即可。
题目代码:
#include <cstdio>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#define LL long long
using namespace std;
//扩展欧几里德
LL exgcd(LL a, LL b, LL &x, LL &y){if(!b){ x = 1; y = 0; return a; }else {exgcd(b, a%b, y, x); y -= x*(a/b);}
}int main(){freopen("input.txt", "r" , stdin);LL a,b,x,y;scanf("%lld %lld",&a, &b);exgcd(a,b,x,y);LL ans = (x%b+b)%b; // 消除负数// 因为gcd(a,b) == 1 printf("%lld\n",ans);return 0;
}