結果
| 問題 |
No.195 フィボナッチ数列の理解(2)
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-11-13 19:38:55 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,236 bytes |
| コンパイル時間 | 1,826 ms |
| コンパイル使用メモリ | 177,540 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-09-15 01:26:03 |
| 合計ジャッジ時間 | 2,827 ms |
|
ジャッジサーバーID (参考情報) |
judge6 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 14 WA * 8 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
// a * x + b * y = v0
// c * x + d * y = v1
pair<ll,ll> niziho(ll a, ll b, ll v0, ll c, ll d, ll v1){
ll div = a * d - b * c;
if(div == 0)return make_pair(-1, -1);
ll num1 = v0 * d - b * v1;
ll num2 = a * v1 - c * v0;
if(num1 % div != 0 || num2 % div != 0)return make_pair(-1, -1);
return make_pair(num1 / div, num2 / div);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
vector<ll> a(3);
cin >> a[0] >> a[1] >> a[2];
vector<pair<ll,ll>> b(46);
sort(a.begin(), a.end());
a.erase(unique(a.begin(), a.end()), a.end());
b[0] = {1, 0};
b[1] = {0, 1};
for(int i = 2; i < 46; i++){
b[i] = {b[i - 1].first + b[i - 2].first, b[i - 1].second + b[i - 2].second};
}
pair<ll,ll> ans = {1ll << 60, 1ll << 60};
if(a.size() == 3){
for(int i = 2; i < 46; i++){
for(int j = 4; j < 46; j++){
auto p = niziho(b[i].first, b[i].second, a[0], b[j].first, b[j].second, a[1]);
if(p.first <= 0 || p.second <= 0)continue;
for(int k = j; k < 46; k++){
ll v = p.first * b[k].first + p.second * b[k].second;
if(v > a[2])break;
if(v == a[2]){
ans = min(ans, p);
break;
}
}
}
}
}else if(a.size() == 2){
ans = {a[0], a[1]};
for(int i = 2; i < 46; i++){
for(int j = 4; j < 46; j++){
auto p = niziho(b[i].first, b[i].second, a[0], b[j].first, b[j].second, a[1]);
if(p.first <= 0 || p.second <= 0)continue;
ans = min(ans, p);
}
}
}else if(a.size() == 1){
ans = {a[0], a[0]};
for(int i = 1; i < 46; i++){
ll v = a[0] - b[i].first;
if(v <= 0)break;
if(v % b[i].second == 0){
v /= b[i].second;
ans = min(ans, make_pair(1ll, v));
}
}
}
if(ans.first >> 60 & 1){
cout << -1 << '\n';
return 0;
}
cout << ans.first << " " << ans.second << '\n';
}