結果
| 問題 | No.3559 +A,-B |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-05-25 04:46:47 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 1,809 bytes |
| 記録 | |
| コンパイル時間 | 2,328 ms |
| コンパイル使用メモリ | 332,988 KB |
| 実行使用メモリ | 7,976 KB |
| 最終ジャッジ日時 | 2026-05-29 18:55:43 |
| 合計ジャッジ時間 | 6,592 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge2_1 |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| 部分点1 | 10 % | AC * 4 |
| 部分点2 | 60 % | RE * 7 |
| 部分点3 | 30 % | AC * 4 RE * 16 |
| 合計 | 10 点 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
int main() {
cin.tie(0)->sync_with_stdio(0);
cin.exceptions(cin.failbit);
int T;
cin >> T;
assert(1 <= T && T <= 100'000);
while (T--) {
long long N, X, Y, A, B;
cin >> N >> X >> Y >> A >> B;
assert(1 <= N && N <= 1'000'000'000);
assert(-1'000'000'000 <= min({X, Y, A, B}) && max({X, Y, A, B}) <= 1'000'000'000);
assert(N <= 10);
if (X + Y < 0) {
if (X + (N - 1) * A + Y < 0) {
cout << X + N * A << " " << Y << endl;
continue;
}
long long c = (- X - Y + A - 1) / A;
N -= c;
X += c * A;
}
if (X + Y - (N - 1) * B >= 0) {
cout << X << " " << Y - N * B << endl;
continue;
}
long long c = (X + Y) / B + 1;
N -= c;
Y -= c * B;
if (X + (N - 1) * A + Y < 0) {
cout << X + N * A << " " << Y << endl;
continue;
}
c = N / (A + B);
X += A * B * c;
Y -= A * B * c;
N %= A + B;
for (int i = 30; i >= 0; i--) {
long long k = 1 << i;
long long s = (X + Y + k * A);
long long l = (s + B) / B;
if (k + l <= N) {
N -= k + l;
X += A * k;
Y -= B * l;
}
}
while (N) {
if (X + Y < 0) {
long long c = min(N, (- X - Y + A - 1) / A);
N -= c;
X += c * A;
}
else{
long long c = min(N, (X + Y) / B + 1);
N -= c;
Y -= c * B;
}
}
cout << X << " " << Y << endl;
}
return 0;
}