HDU 2516 取石子游戏
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 2516 取石子游戏相关的知识,希望对你有一定的参考价值。
Problem Description
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
2
13
10000
0
Sample Output
Second win
Second win
First win
分析
先取的人:A 后取的人:B
2个石子时:A肯定输,B胜。
3个石子时:A取1个或者两个,还是输,B胜。
4个石子时:A可以在第一次取1个石子取胜,A胜。
5个石子时:A第一次取1个,然后B完全可以只取1个,让局面变成3个石子的情形,B胜;A第一次取2个,B胜。
6个石子时:A第一次取1个,然后B再取1个,局面就变成4个石子的情形,A胜,如果B取2个,只剩下3个A可以取完,A胜。
7个石子时:A第一次取2个,然后B再取1个,剩下4个石子的情形,A胜,如果B取2个或者3个或者4个,剩下的A都可以可以一次取完,A胜。
8个石子时:A第一次取1个,B可以取2个,剩下5个石子的局面,B胜;A第一次取2个,B可以去1个,剩下还是5个石子,B胜;A第一次取3个,B可以取完,B胜。
以此类推,可以发现当石子的个数是斐波那契数列中的数时B都可以取胜,否则A可以取胜。
#include<iostream> using namespace std; int main() { //2^31 =2147483648 long long int a[45];//a[44]=2971215073 a[0]=2,a[1]=3; long long int n; for(int i=2;i<45;i++) a[i]=a[i-1]+a[i-2]; while(cin>>n && n!=0) { int i; for(i=0;i<45;i++) if(n==a[i]) break; if(i>44) cout<<"First win"<<endl; else cout<<"Second win"<<endl; } return 0; }
以上是关于HDU 2516 取石子游戏的主要内容,如果未能解决你的问题,请参考以下文章