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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值