題目鏈接:https://codeforces.com/gym/102021/attachments
題意:假設現在有兩隻怪獸和,生命力分別是和,兩隻怪獸輪流進攻,生命力小於等於時死亡,進攻方生命力不變,例如當進攻的時候,生命力不變還是,但是的生命力變成,然後進攻,該輪結束後雙方生命力變成了,。問現在有只怪獸,生命力分別給出,問你能不能找到兩隻怪獸,當遊戲結束的時候勝利怪獸的生命力爲。
解題心得:其實他們的進攻過程中生命力就是一個斐波那契數列,最後勝利怪獸生命力爲,那麼死掉怪獸生命力一定爲,那麼就是以,開始的一個斐波那契數列,我們只需要找在個怪獸中是否有兩個怪獸的生命力剛好是我們得到的數列中相鄰的兩項就行了。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 6;
int fib[40];
vector<int> ve[maxn];
int main()
{
ios::sync_with_stdio(false), cin.tie(nullptr);
fib[1] = 1, fib[2] = 1;
for(int i = 3; i < 40; i++) fib[i] = fib[i - 1] + fib[i - 2];
int n;
cin >> n;
for(int i = 1; i <= n; i++){
int x;
cin >> x;
ve[x].push_back(i);
}
if(ve[1].size() >= 2){
cout << ve[1][0] << ' ' << ve[1][1] << '\n';
} else{
for(int i = 2; i < 40 && fib[i + 1] < maxn; i++){
if(ve[fib[i]].size() && ve[fib[i + 1]].size()){
cout << ve[fib[i]][0] << ' ' << ve[fib[i + 1]][0] << '\n';
return 0;
}
}
cout << "impossible\n";
}
return 0;
}