結果
| 問題 |
No.3162 Five Two Three
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-05-23 19:52:57 |
| 言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 288 ms / 1,523 ms |
| コード長 | 4,279 bytes |
| コンパイル時間 | 9,276 ms |
| コンパイル使用メモリ | 220,148 KB |
| 実行使用メモリ | 7,848 KB |
| 最終ジャッジ日時 | 2025-05-23 19:54:01 |
| 合計ジャッジ時間 | 60,274 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 187 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef pair<ll, ll> P;
typedef pair<__int128_t, __int128_t> P128;
const ll len = 65;
vector<__int128_t> ans;
template<class T1, class T2>
pair<T1, T2> operator+ (const pair<T1, T2> &l, const pair<T1, T2> &r) {
return {l.first + r.first, l.second + r.second};
}
template<class T1, class T2>
pair<T1, T2> operator- (const pair<T1, T2> &l, const pair<T1, T2> &r) {
return {l.first - r.first, l.second - r.second};
}
pair<__int128_t, bool> deduce1 (P128 p, __int128_t a0, __int128_t val) {
__int128_t war = val - p.first * a0;
return {war / p.second, (war % p.second == 0)};
}
// pair<__int128_t, bool> deduce1 (__int128_t p, __int128_t val) {
// return {val / p, (val % p == 0)};
// }
void seekcand (__int128_t x, __int128_t y, __int128_t z, int xi, int xj) {
vector<P128> a = {
{1, 0},
{0, 1}
};
for (int i = 0; i < xi; i++) {
P128 bl = a[a.size() - 2];
P128 br = a[a.size() - 1];
a.push_back(bl - br);
}
for (int i = 0; i < xj; i++) {
P128 bl = a[a.size() - 2];
P128 br = a[a.size() - 1];
a.push_back(bl + br);
}
// vector<__int128_t> cand;
for (int zi = 1; zi < a.size(); zi++) {
for (int yi = zi+1; yi < a.size(); yi++) {
bool hascand = false;
__int128_t c = 0;
if (a[zi].second != 0) {
auto c_ = deduce1(a[zi], x, z);
if (!c_.second) continue;
c = c_.first;
hascand = true;
} else if (a[yi].second != 0) {
auto c_ = deduce1(a[yi], x, y);
if (!c_.second) continue;
c = c_.first;
hascand = true;
} else {
// if (x * a[zi].first == z && x * a[yi].first == y) {
// c = 0;
// hascand = false;
// } else {
// continue;
// }
exit(1);
}
// cerr << "c ? " << (ll)c << endl;
if (hascand) {
if (x * a[zi].first + c * a[zi].second != z) continue;
if (x * a[yi].first + c * a[yi].second != y) continue;
bool isgeq0 = true;
for (int i = 0; i <= yi; i++) {
__int128_t val = x * a[i].first + c * a[i].second;
if (val < 0) {
isgeq0 = false;
break;
}
}
if (isgeq0) {
vector<__int128_t> cand;
for (int i = 0; i <= yi; i++) {
cand.push_back(x * a[i].first + c * a[i].second);
}
if (ans.size() == 0 || cand.size() < ans.size()) {
ans = cand;
}
} else {
continue;
}
} else {
exit(1);
}
}
}
}
void seek2 (__int128_t x, __int128_t y, __int128_t z) {
vector<__int128_t> after = {1, 0}, before = {1, 0};
for (int i = 0; i < len + 5; i++) {
__int128_t bl = after[after.size() - 2];
__int128_t br = after[after.size() - 1];
after.push_back(bl + br);
}
for (int i = 0; i < len + 5; i++) {
__int128_t bl = before[before.size() - 2];
__int128_t br = before[before.size() - 1];
before.push_back(bl + br);
}
vector<__int128_t> a;
for (int i = before.size() - 1; i >= 0; i--) {
a.push_back(before[i]);
}
for (int i = 0; i < after.size(); i++) {
a.push_back(after[i]);
}
for (int xi = 0; xi < a.size(); xi++) {
for (int zi = xi+1; zi < a.size(); zi++) {
for (int yi = zi+1; yi < a.size(); yi++) {
__int128_t c;
if (a[xi] != 0) {
if (x % a[xi] != 0) continue;
c = x / a[xi];
} else if (a[zi] != 0) {
if (z % a[zi] != 0) continue;
c = z / a[zi];
} else if (a[yi] != 0) {
if (y % a[yi] != 0) continue;
c = y / a[yi];
} else {
// because (x, y, z) != (0,0,0)
continue;
}
if (c * a[xi] != x) continue;
if (c * a[zi] != z) continue;
if (c * a[yi] != y) continue;
vector<__int128_t> cand;
for (int i = xi; i <= yi; i++) {
cand.push_back(c * a[i]);
}
if (ans.size() == 0 || cand.size() < ans.size()) {
ans = cand;
}
}
}
}
}
void solve (__int128_t x, __int128_t y, __int128_t z) {
if (x == 0 && y == 0 && z == 0) {
ans = {0, 0, 0};
return;
}
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
seekcand(x, y, z, i, j);
}
}
seek2(x, y, z);
}
int main (void) {
ll x, y, z;
cin >> x >> y >> z;
solve(x, y, z);
if (ans.size() == 0) {
cout << "-1\n";
} else {
cout << ans.size() << "\n";
for (int i = 0; i < ans.size(); i++) {
if (i > 0) cout << " ";
cout << (ll)ans[i];
}
cout << "\n";
}
return 0;
}