Description
小明和小头遇到了矛盾,他们决定用男人的方式解决战斗——石头剪刀布。但是小菜觉得石头剪刀布已经过时了,于是他发明了另一个更男人的游戏。小菜给出一个自然数n,小明和小头轮流操作,每次操作可以把n减去n所拥有的数字中的最大值或者最小值(不包括0),不能操作者输(即当n=0时)。
小菜怕他们不懂,于是给了一个例子n=1024,则最大值=4,最小值=1。假如小明先操作,那么他可以留给小头1023或者1020。
小明和小头觉得这个游戏很好玩,于是打算多玩几局。每次由小明先操作,如果两人都是用最佳策略,请问谁会赢?
Input
第一行只有一个整数t,表示玩t轮游戏
接下来t行,每行一个自然数n,表示初始时小菜给出的自然数。
Output
共t行,如果小明赢了第i轮游戏则在第i行输出“YES” 否则输出“NO”
Sample Input
2
9
10
Sample Output
YES
NO
Data Constraint
Hint
【数据规模】
40%的数据n≤50
100%的数据t≤100,n≤1000000
.
.
.
.
.
.
.
分析
显然我们发现这个输赢是奇偶分配的,所以可以转移动态 fi=!fj
那么j是什么呢? 就是i-i中最大值和i-i中最小值,那么设这两为j,k得 fi=!fj∨!fk
那么我们预处理1~10^6的所有值即可
.
.
.
.
.
.
.
程序:
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
bool f[1000001];
int t,n;
cin>>t;
for (int i=1;i<=1000000;i++)
{
int y=i,maxx=0,minn=2147483647;
while (y>0)
{
if (y%10)
{
maxx=max(maxx,y%10);
minn=min(minn,y%10);
}
y/=10;
}
f[i]=!f[i-maxx]||!f[i-minn];
}
for (int i=1;i<=t;i++)
{
cin>>n;
if (f[n]) cout<<"YES"<<endl; else cout<<"NO"<<endl;
}
return 0;
}