-
Problem Description
两个足够聪明的人玩轮流取石头的游戏,谁取到最后一个石头谁就赢了,他们一次只能取1个、3个、7个或8个石头,写一程序判断n个石头时先取的人是输还是赢。
输入格式:
一个整数n,其值不超过10000000。
输出格式:
如果先取的人赢,请以单独一行输出1,否则输出0。
输入样例:
这里是3组输入。
1
10
300
输出样例:
上面3组数据对应的输出分别如下:
1
1
0
-
问题解读
首先这两个人都足够聪明。假使第一个人先取,他会想尽办法赢。但第二个人也不是吃素的,他会不遗余力的阻击第一个人赢。由于石头数不确定,我们不妨先用较小数目的石头试试水,看看能否找到规律。
-
枚举分析
我们假设 P 1 P_1 P1、 P 2 P_2 P2分别代表第一个人和第二个人,且第一个人先取,现在来枚举几种情况,看看第一个人什么情况下去会赢。
一个石头:
注:第一个人赢。
两个石头:
注:第一个人输。
三个石头:
第一种情况:
注:第一个人赢。
第二种情况:
注:第一个人赢。
四个石头:
第一种情况:
注:第一个人赢。
第二种情况:
注:第一个人赢。
五个石头:
第一种情况:
注:第一个人赢。
第二种情况:
注:第一个人赢。
第三种情况:
注:第一个人赢。
继续枚举,发现当石头数为:2 4 6 15 17 19 30 32 34 36 45 47 49 51……时,第二个人赢。观察这些数据可以发现:当n%15==0或2或4或6时,第二个人赢,其余情况第一个人赢。这样,我们就找到了规律。
-
代码实现
#include<iostream>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
if(n%15==0)
cout<<0;
else if(n%15==2)
cout<<0;
else if(n%15==4)
cout<<0;
else if(n%15==6)
cout<<0;
else
cout<<1;
}
return 0;
}
-
运行结果