rt
一个正整数 x,满足除以 pi 余 pi−t,给定 n,t,求 x
多测,当输入 n,t 都为 0 时结束
#include <bits/stdc++.h>
#include <bits/extc++.h>
#define int long long
using namespace __gnu_cxx;
using namespace __gnu_pbds;
using namespace std;
int n, t, a[11], m[11];
int mul(int x, int y, int m) {
int a = 0;
y %= m;
while (y > 0) {
if (y & 1) a = (a + x) % m;
x = (x + x) % m, a %= m, y >>= 1;
}
return a % m;
}
void Exgcd(int a, int b, int &x, int &y) {
if (b == 0) {
x = 1, y = 0;
return;
}
Exgcd(b, a % b, x, y);
int z = x;
x = y, y = z - y * (a / b);
return;
}
int CRT(int n, int a[], int m[]) {
int ans = 0, mod = 1;
for (int i = 1; i <= n; i++) mod *= m[i];
for (int i = 1; i <= n; i++) {
int x, y, mi = mod / m[i];
Exgcd(mi, m[i], x, y);
x = (x % m[i] + m[i]) % m[i];
ans += mul(mul(mi, x, mod), a[i], mod) % mod;
}
return (ans % mod + mod) % mod;
}
signed main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
while (cin >> n >> t) {
if (n == 0 && t == 0) break;
for (int i = 1; i <= n; i++) {
cin >> m[i], a[i] = m[i] - t;
}
cout << CRT(n, a, m) << '\n';
}
return 0;
}
样例:
input:
3 2
3 5 7
0 0
output:
103
调了半天了没看出来有什么问题,ChatGPT 也没发现问题