原題目:
1堆石子有n個,兩人輪流取.先取者第1次可以取任意多個,但不能全部取完.以後每次取的石子數不能超過上次取子數的2倍。取完者勝.先取者負輸出"second win".先取者勝輸出"first win".
input
輸入有多組.每組第1行是2<=n<2^31. n=0退出.
output
先取者負輸出"second win". 先取者勝輸出"first win".
參看sample output.
sample input
2sample output1310000
0
second winsecond win
first win
#include #include #include using namespace std;
__int64 a[50],len;
const __int64 inf = 2147483648+10;
int main()
len = i;
while(~scanf("%i64d",&n),n)
if(flag)
printf("second win\n");
else
printf("first win\n");
}return 0;
}
思路:
斐波那契博弈
有一堆個數為n(n>=2)的石子,遊戲雙方輪流取石子,規則如下:
1)先手不能在第一次把所有的石子取完,至少取1顆;
2)之後每次可以取的石子數至少為1,至多為對手剛取的石子數的2倍。
約定取走最後乙個石子的人為贏家,求必敗態。
結論:當n為fibonacci數的時候,必敗。
f[i]:1,2,3,5,8,13,21,34,55,89……
記著吧為什麼在各種演算法or技巧總結專欄裡面
HDU 2516 取石子遊戲(斐波那契博弈)
本題是傳說中的斐波那契博弈,即 必敗點形成了fibonacci數列,通過找規律就可以看出來的 為何比賽時木有發現 problem description 1堆石子有n個,兩人輪流取.先取者第1次可以取任意多個,但不能全部取完.以後每次取的石子數不能超過上次取子數的2倍。取完者勝.先取者負輸出 sec...
HDU2516 取石子遊戲 斐波那契博弈
1堆石子有n個,兩人輪流取.先取者第1次可以取任意多個,但不能全部取完.以後每次取的石子數不能超過上次取子數的2倍。取完者勝.先取者負輸出 second win 先取者勝輸出 first win 輸入有多組.每組第1行是2 n 2 31.n 0退出.先取者負輸出 second win 先取者勝輸出 ...
HDU 2516 取石子遊戲(斐波那契博弈)
看這道題之前先看看什麼叫斐波那契博弈 斐波那契博弈 需要知道 zeckendorf定理 齊肯多夫定理 任何正整數可以表示為若干個不連續的fibonacci數之和。總結一下就是如果給定的數是斐波那契數列中的乙個,則先手必敗,否則先手必勝,沒有什麼道理的裸題 include include includ...