LOJ样例TLE求助
查看原帖
LOJ样例TLE求助
149192
__gcd楼主2021/3/9 20:18

rt,本机样例能过,luoguWA40pts,LOJ-O2样例TLE。

#include<bits/stdc++.h>
#define db double
#define int long long
using namespace std;
inline int read() {
	int x = 0; bool op = false;
	char c = getchar();
	while(!isdigit(c))op |= (c == '-'), c = getchar();
	while(isdigit(c))x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
	return op ? -x : x;
}
const int N = 100010;
int n, m;
int p[N], a[N], b[N], add[N];
int gcd(int a, int b) {return b ? gcd(b, a % b) : a;}
int exgcd(int a, int b, int &x, int &y) {
	if(b == 0) {x = 1; y = 0; return a;}
	int res = exgcd(b, a % b, y, x); y -= (a / b) * x;
	return res;
}
int sol(int a, int b, int c) {
	int x, y;
	int g = exgcd(a, b, x, y);
	if(c % g)return -1;
	return (x * (c / g) % (b / g) + (b / g)) % (b / g);
}
signed main() {
	int test = read();
	while(test--) {
		multiset<int> s;
		n = read(); m = read();
		for(int i = 1; i <= n; i++)a[i] = read();
		for(int i = 1; i <= n; i++)p[i] = read();
		for(int i = 1; i <= n; i++)add[i] = read();
		for(int i = 1; i <= m; i++) {
			int x = read(); s.insert(x);
		}
		bool flg = false;
		for(int i = 1; i <= m; i++) {
			multiset<int>::iterator it = s.upper_bound(a[i]);
			if(it != s.begin())--it; 
			int atk = *it; s.erase(it); s.insert(add[i]); 
			int tmp = sol(atk, p[i], a[i]);
			if(tmp == -1)flg = true; else b[i] = tmp;
		}
		if(flg) {puts("-1"); continue;}
		int M = p[1], ans = b[1];
		for(int i = 2; i <= n; i++) {
			int k = sol(M, p[i], b[i] - ans), tmp = M;
			if(k == -1)flg = true;
			M = M / gcd(M, p[i]) * p[i]; ans = (ans + (tmp * k) % M) % M;
		}
		if(flg) {puts("-1"); continue;}
		printf("%lld\n", ans);
	}
	return 0;
}
2021/3/9 20:18
加载中...