求调 CRT
  • 板块学术版
  • 楼主__er
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/5/23 21:03
  • 上次更新2023/10/23 14:55:08
查看原帖
求调 CRT
713955
__er楼主2023/5/23 21:03

有一正整数 xx, xx 除以 p1p_1 余 p1−tp_1-t, xx 除以 p2p_2 余 p2−tp_2-t, xx 除以 p3p_3 余 p3−t…p_3-t \ldots

求满足条件的 xx 的最小正整数解。

多组测试数据 每组测试数据两行,第一行为两个空格隔开的正整数 nn 和 tt,nn 表示 pip_i 的个数;第二行为 nn 个空格隔开的正整数,

测试数据以 nn 和 tt 为 00 和 00 时结束

1<n<10,0<t<pi<1001 < n<10,0<t<p_i<100

#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, a[i] %= m[i];
		cout << CRT(n, a, m) << '\n';
	}
	return 0;
}

90pts90pts 没发现错

2023/5/23 21:03
加载中...