背景 Background
zst神犇翻开奥数,发现一道博弈论,于是他让蒟蒻lzf把它做成一道OI题......描述 Description
甲乙两人玩一个游戏:一张卡片上有个数字,甲乙两人轮流操作,若当前卡片上的数字为x,每次操作可以把它变为x+1或2x,且不能超过n(例如n=8,x=6,只能变为7而不能变为12),每次甲首先在卡片上写1,规定写n的人获胜。给定n,问甲是否有必胜策略?输入格式 InputFormat
共t+1行,第一行是一个正整数t,表示数据组数,下面t行,每行一个正整数n,含义如题所述输出格式 OutputFormat
共t行,每行为'YES'或'NO',若甲有必胜策略则输出'YES',否则输出'NO'样例输入 SampleInput
2 7 8
样例输出 SampleOutput
YES NO
数据范围和注释 Hint
数据范围t<=10000
n<2^63
思路:
博弈
当n为奇数, 则必胜(甲不取偶数乙就不能取奇数)。
当n为偶数,若n必胜则n/2~n所有偶数都必胜, n/4~n
/2所有偶数都必败, 所以n/4为一周期, 且n必胜时,n/
4必胜, 当n/4/4...最终
为二时则乙胜, 当必胜的n为奇
数则甲胜。
#include <stdio.h>
int dfs(__int64 n)
{
if(n == 2)
{
return 0;
}
else if(n % 2)
{
return 1;
}
else
{
return dfs(n/4);
}
}
int main()
{
int t;
__int64 n;
scanf("%d", &t);
while(t--)
{
scanf("%I64d", &n);
if(dfs(n))
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}