結果
| 問題 | No.3559 +A,-B |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-05-29 21:56:52 |
| 言語 | C++17 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 63 ms / 2,000 ms |
| コード長 | 1,703 bytes |
| 記録 | |
| コンパイル時間 | 1,489 ms |
| コンパイル使用メモリ | 215,576 KB |
| 実行使用メモリ | 6,400 KB |
| 最終ジャッジ日時 | 2026-05-29 21:56:59 |
| 合計ジャッジ時間 | 5,773 ms |
|
ジャッジサーバーID (参考情報) |
judge4_1 / judge1_0 |
| 純コード判定待ち |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| 部分点1 | 10 % | AC * 4 |
| 部分点2 | 60 % | AC * 7 |
| 部分点3 | 30 % | AC * 20 |
| 合計 | 100 点 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int T; cin >> T;
while(T--){
long long N,X,Y,A,B; cin >> N >> X >> Y >> A >> B;
bool end = false;
auto f = [&]() -> pair<long long,long long> {
if(X+Y >= 0){
end = B<=0;
return {X,Y-B};
}
else{
end = A<=0;
return {X+A,Y};
}
};
auto ans = [&]() -> void {cout << X << " " << Y << "\n";};
tie(X,Y) = f(),N--;
if(end || N == 0){
if(X+Y >= 0) Y -= B*N;
else X += A*N;
ans(); continue;
}
if(X+Y >= 0){
long long ope = (X+Y+1+B-1)/B;
ope = min(ope,N);
Y -= B*ope,N -= ope;
}
else{
long long ope = (-(X+Y)+A-1)/A;
ope = min(ope,N);
X += A*ope,N -= ope;
}
if(N == 0){ans(); continue;}
tie(X,Y) = f(),N--;
if(end || N == 0){
if(X+Y >= 0) Y -= B*N;
else X += A*N;
ans(); continue;
}
long long g = gcd(abs(A),abs(B)),lcm = abs(A*B)/g,cycle = lcm/A+lcm/B;
long long loop = N/cycle;
X += lcm*loop,Y -= lcm*loop;
N %= cycle;
long long low = -1,high = N+1;
while(high-low > 1){
long long mid = (high+low)/2;
long long dec = mid,add = N-mid;
long long now = X+Y+add*A-dec*B;
if(now >= A) low = mid;
else high = mid;
}
Y -= high*B,X += (N-high)*A;
ans();
}
}