zst的博弈

背景 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;
}


你可能感兴趣的:(博弈)