結果
問題 |
No.3162 Five Two Three
|
ユーザー |
👑 ![]() |
提出日時 | 2025-05-23 20:44:19 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 16 ms / 1,523 ms |
コード長 | 2,984 bytes |
コンパイル時間 | 775 ms |
コンパイル使用メモリ | 82,460 KB |
実行使用メモリ | 7,848 KB |
最終ジャッジ日時 | 2025-05-23 20:44:29 |
合計ジャッジ時間 | 9,571 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 187 |
ソースコード
#ifdef NACHIA #define _GLIBCXX_DEBUG #else #define NDEBUG #endif #include <iostream> #include <string> #include <vector> #include <algorithm> using i64 = long long; using u64 = unsigned long long; #define rep(i,n) for(i64 i=0; i<i64(n); i++) const i64 INF = 1001001001001001001; template<typename A> void chmin(A& l, const A& r){ if(r < l) l = r; } template<typename A> void chmax(A& l, const A& r){ if(l < r) l = r; } using namespace std; using i128 = __int128_t; vector<i128> A1, B1, A2; void changeAns(vector<i128>& l, vector<i128> r){ if(l.size() == 0) swap(l, r); if(r.size() == 0) return; if(l.size() > r.size()) swap(l, r); } void testcase(){ i128 X, Y, Z; { i64 x, y, z; cin >> x >> z >> y; X = x; Y = y; Z = z; } if(X == 0 && Y == 0 && Z == 0){ cout << "3\n0 0 0\n"; return; } if(X == Y && Y == Z){ cout << "4\n" << i64(X) << " 0 " << i64(X) << " " << i64(X) << "\n"; return; } A1 = {1,0}; B1 = {0,1}; rep(f,2){ while(max(A1.back(), B1.back()) < (1ll << 41)){ A1.push_back(A1[A1.size() - 1] + A1[A1.size() - 2]); B1.push_back(B1[B1.size() - 1] + B1[B1.size() - 2]); } reverse(A1.begin(), A1.end()); reverse(B1.begin(), B1.end()); } A2 = {1,0,1,1,0,1}; rep(f,2){ while(A2.back() < (1ll << 41)){ A2.push_back(A2[A2.size() - 1] + A2[A2.size() - 2]); } reverse(A2.begin(), A2.end()); } bool sw = false; if(X == Y){ sw = true; swap(X, Z); } vector<i128> ans; rep(c,A2.size()) rep(b,c) rep(a,b){ if(A2[a] * Y != A2[b] * X) continue; if(A2[a] == 0 && A2[b] == 0) continue; i64 q = (A2[a] == 0) ? Y / A2[b] : X / A2[a]; if(A2[a] * q != X) continue; if(A2[b] * q != Y) continue; if(A2[c] * q != Z) continue; vector<i128> f; for(i64 i=a; i<=c; i++) f.push_back(A2[i] * q); changeAns(ans, move(f)); } rep(c,A1.size()) rep(b,c) rep(a,b){ i128 x = X * B1[b] - Y * B1[a]; i128 y = A1[a] * Y - A1[b] * X; i128 d = A1[a] * B1[b] - A1[b] * B1[a]; if(d < 0){ x = -x; y = -y; d = -d; } if(d == 0) continue; if(x % d != 0 || x < 0) continue; if(y % d != 0 || y < 0) continue; x /= d; y /= d; if(Z != A1[c] * x + B1[c] * y) continue; vector<i128> f; for(i64 i=a; i<=c; i++) f.push_back(A1[i] * x + B1[i] * y); bool ok = true; for(auto g : f) if(g < 0) ok = false; if(ok) changeAns(ans, move(f)); } if(sw) reverse(ans.begin(), ans.end()); if(ans.size() == 0){ cout << "-1\n"; } else { cout << ans.size() << "\n"; rep(i,ans.size()){ if(i) cout << " "; cout << i64(ans[i]); } cout << "\n"; } } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); testcase(); return 0; }