题目描述
求关于 x 的同余方程 ax≡1(modb) 的最小正整数解。
输入格式
一行,包含两个整数 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。
代码实现:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll pow(ll a, ll b, ll p) {
ll base = a, res = 1;
while (b > 0) {
if (b & 1) {
res *= base;
res %= p;
}
base *= base;
base %= p;
b >>= 1;
}
return res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int a, mod;
cin >> a >> mod;
ll t = 1, tmp = mod, cnt = 0;
while (!(tmp & 1)) {
cnt++;
tmp >>= 1;
}
t *= pow(2, cnt - 1, mod);
for (int i = 3; i * i <= tmp; i += 2) {
cnt = 0;
while (tmp % i == 0) {
cnt++;
tmp /= i;
}
if (cnt > 0) {
t = t * (i - 1) % mod * pow(i, cnt - 1, mod) % mod;
}
}
if (tmp != 1) t *= (tmp - 1);
cout << pow(a, t - 1, mod) % mod << endl;
return 0;
}