EXCRT求助 WA30pts
查看原帖
EXCRT求助 WA30pts
497711
EnriqueYXH楼主2022/7/26 20:13

代码中int->longlong, ll->__int128

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#define int long long
#define up(i, a, b) for (int i = a; i <= b; i++)
#define dn(i, a, b) for (int i = a; i >= b; i--)
using namespace std;
typedef __int128 ll;
int read() {
	int x = 0, f = 1; char ch = getchar();
	while (ch < '0' || ch > '9') {if (ch == '-') f = -1;ch = getchar();}
	while (ch >= '0' && ch <= '9') {x = (x << 1) + (x << 3) + (ch ^ 48);ch = getchar();}
	return x * f;
}
const int N = 1e5 + 5;
int n, m, A[N], atk[N], p[N], B[N], mi, gcd;
void exgcd(int a, int b, int &x, int &y) {
	if (!b) x = 1, y = 0, gcd = a;
	else exgcd(b, a % b, y, x), y -= a / b * x;
}
int excrt() {
	int mul = p[1], ans = A[1], x, y, bg;
	up(i, 2, n) {
		int a = (ll)B[i] * mul % p[i];
		int b = p[i];
		int c = (A[i] - B[i] * ans % p[i] + p[i]) % p[i];
		exgcd(a, b, x, y);
		if (c % gcd) return -1;
		bg = b / gcd;
		x = (ll)x % bg * (c / gcd) % bg;
		ans += mul * x;
		mul *= bg;
		ans = (ans % mul + mul) % mul;
	}
	if (ans < mi) ans += ((mi - ans - 1) / mul + 1) * mul;
	return ans;
}
signed main() {
	int T = read();
	while (T--) {
		mi = 0;
		multiset <int> s;
		n = read(), m = read();
		up(i, 1, n) A[i] = read();
		up(i, 1, n) p[i] = read();
		up(i, 1, n) atk[i] = read();
		up(i, 1, m) s.insert(read());
		up(i, 1, n) {
			auto pt = s.upper_bound(A[i]);
			if (pt != s.begin()) pt--;
			B[i] = *pt;
			s.erase(pt);
			s.insert(atk[i]);
			mi = max(mi, (A[i] - 1) / B[i] + 1);
		}
		printf("%lld\n", excrt());
	}
	return 0;
}

重打了一遍还是30分

2022/7/26 20:13
加载中...