社区讨论
70pts 求调
P4774[NOI2018] 屠龙勇士参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mlgy2ay2
- 此快照首次捕获于
- 2026/02/11 02:38 上周
- 此快照最后确认于
- 2026/02/12 18:15 7 天前
RT,误判了 inf 个
CPP-1。#include<bits/stdc++.h>
#define int __int128
using namespace std;
bool ST;
inline int read(){
int x = 0, f = 1;
char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') f = -1;
ch = getchar();
}
while(isdigit(ch)){
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x * f;
}
inline void pc(char ch){putchar(ch);}
inline void write(int x){
if(x < 0) pc('-'), x = -x;
if(x > 9) write(x / 10);
pc(x % 10 + '0');
return;
}
inline int exgcd(int a, int b, int &x, int &y){
if(!b) return x = 1, y = 0, a;
int d = exgcd(b, a % b, x, y);
int X = x, Y = y;
x = Y, y = X - (a / b) * Y;
return d;
}
inline int gcd(int a, int b){int x, y; return exgcd(a, b, x, y);}
inline int lcm(int a, int b){return a / gcd(a, b) * b;}
#define abs(x) ((x) > 0 ? (x) : -(x))
int n, m, a[100005], p[100005], award[100005];
multiset<int> sword;
inline void Solve(){
sword.clear();
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++) award[i] = read();
for(int i = 1; i <= m; i++) sword.insert(read());
int ans = 0, P = 1, ci = 0;
for(int i = 1; i <= n; i++){
auto b = sword.upper_bound(a[i]);
if(b != sword.begin()) b--;
// ans + P * u
// *b(ans + Pu) = a[i] + p[i]*v
// *b * ans + *b * P * u = a[i] + p[i] * v
// *b * P * u + p[i] * v = a[i] - *b * ans
int A = (*b) * P % p[i];
int B = p[i];
int C = (a[i] - (*b) * ans % p[i] + p[i]) % p[i];
// write(A), pc(' '), write(B), pc(' '), write(C), pc('\n');
int d = gcd(A, B);
if(C % d != 0){
write(-1), pc('\n');
return;
}
A /= d, B /= d, C /= d;
int u, v; exgcd(A, B, u, v); u = (u * C % B + B) % B;
int newans = ans + P * u, newp = lcm(P, p[i]);
ans = (newans % newp + newp) % newp, P = newp;
ci = max(ci, (__int128)ceil(1.0 * a[i] / (*b)));
sword.erase(b), sword.insert(award[i]);
}
ans = (ans % P + P) % P;
while(ans < ci) ans += ceil(1.0 * (ci - ans) / P) * P;
write(ans), pc('\n');
return;
}
bool ED;
signed main(){
int T = read();
while(T--) Solve();
cerr << 1.0 * abs(&ED - &ST) / 1024 / 1024 << " MB" << '\n';
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...