結果
| 問題 |
No.2104 Multiply-Add
|
| コンテスト | |
| ユーザー |
matsup10
|
| 提出日時 | 2022-10-22 00:15:22 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 15 ms / 2,000 ms |
| コード長 | 2,584 bytes |
| コンパイル時間 | 2,373 ms |
| コンパイル使用メモリ | 253,860 KB |
| 最終ジャッジ日時 | 2025-02-08 10:43:01 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 32 |
ソースコード
#include <bits/extc++.h>
using namespace std;
using ll = long long;
#define REP(i,n) for(int i=0;i<int(n);i++)
#define FOR(i,a,b) for(int i=a;i<=int(b);i++)
#define ALL(x) x.begin(),x.end()
#define INFL LLONG_MAX
signed main() {
ll a, b, c, d;
cin >> a >> b >> c >> d;
if(gcd(a, b) != gcd(c, d)) {
cout << -1;
return 0;
}
if(a==c && b==d) {
cout << 0;
return 0;
}
vector<pair<int,ll>> ans1;
ll ta = a, tb = b;
if(ta==0) {
ans1.push_back({1, 1});
ta += tb;
}
if(tb==0) {
ans1.push_back({2, 1});
tb += ta;
}
if(tb < 0) {
ans1.push_back({2, (ta > 0 ? 1 : -1) * (abs(tb) / abs(ta) + 1)});
tb += (abs(tb) / abs(ta) + 1) * abs(ta);
}
if(ta < 0) {
ans1.push_back({1, (abs(ta) / abs(tb) + 1)});
ta += (abs(ta) / abs(tb) + 1) * tb;
}
while(ta != 0) {
if(tb > ta) {
ans1.push_back({2, -((tb - 1) / ta)});
tb %= ta;
if(tb == 0) tb = ta;
} else if (tb < ta) {
ans1.push_back({1, -(ta / tb)});
ta %= tb;
} else {
ans1.push_back({1, -1});
ta = 0;
}
}
vector<pair<int,ll>> ans2;
ll tc = c, td = d;
if(tc==0) {
ans2.push_back({1, -1});
tc += td;
}
if(td==0) {
ans2.push_back({2, -1});
td += tc;
}
if(td < 0) {
ans2.push_back({2, -(tc > 0 ? 1 : -1) * (abs(td) / abs(tc) + 1)});
td += (abs(td) / abs(tc) + 1) * abs(tc);
}
if(tc < 0) {
ans2.push_back({1, -(abs(tc) / abs(td) + 1)});
tc += (abs(tc) / abs(td) + 1) * td;
}
while(tc != 0) {
if(td > tc) {
ans2.push_back({2, ((td-1) / tc)});
td %= tc;
if(td == 0) td = tc;
} else if (td < tc) {
ans2.push_back({1, (tc / td)});
tc %= td;
} else {
ans2.push_back({1, 1});
tc = 0;
}
}
reverse(ALL(ans2));
cout << ans1.size() + ans2.size() << endl;
REP(i, ans1.size()) cout << ans1[i].first << ' ' << ans1[i].second << endl;
REP(i, ans2.size()) cout << ans2[i].first << ' ' << ans2[i].second << endl;
// REP(i, ans1.size()) {
// if(1==ans1[i].first) {
// cout << a + b * ans1[i].second << ' ' << b<< endl;
// a += b * ans1[i].second;
// } else {
// cout << a << ' ' << b + a * ans1[i].second<< endl;
// b += a * ans1[i].second;
// }
// }
// REP(i, ans2.size()) {
// if(1==ans2[i].first) {
// cout << a + b * ans2[i].second << ' ' << b << endl;
// a += b * ans2[i].second;
// } else {
// cout << a << ' ' << b + a * ans2[i].second<< endl;
// b += a * ans2[i].second;
// }
// }
return 0;
}
matsup10