这道题我头一次写博弈论,感觉就像模板,知道怎么用就行:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=1000010;
int sg[M];//sg值的范围0~2//博弈论模板
bool v[10];
int Mex()
{
for(int i=0;;i++)
{
if(!v[i]) return i;
}
}
void Get_Sg(int q)
{
sg[0]=0;
for(int i=1;i<=q;i++)
{
int j=i,mx=-1,mn=10;
while(j>0)
{
if(j%10!=0) mx=max(mx,j%10),mn=min(mn,j%10);
j/=10;
}
memset(v,false,sizeof(v));
if(mx!=-1) v[sg[i-mx]]=true;
if(mn!=10) v[sg[i-mn]]=true;
sg[i]=Mex();
}
}
int main()
{
Get_Sg(1000000);
int n,a;
scanf("%d",&n);
while(n--){
scanf("%d",&a);//这里是输入的数,最开始的起点
if(sg[a]==0) printf("NO\n");//sg=0,先手必败
else printf("YES\n");//sg>0,先手必胜
}
return 0;
}