http://acm.hdu.edu.cn/showproblem.php?pid=1404
DP + 博弈论
找奇异状态 能到达奇异状态的为 非奇异状态 怎么走都到非奇异状态的为奇异状态
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<vector> #include<queue> #include<map> #include<stack> #include<algorithm> using namespace std; //#pragma comment(linker,"/STACK:1000000000,1000000000") #define LL long long const int INF=0x3f3f3f3f; const int N=10000000; short int fail[N]; int dp(int x) { if(fail[x]!=0) return fail[x]; if(x<10) { if(x==1) fail[x]=1; else fail[x]=-1; return fail[x]; } for(int i=x,k=1;i>1;i=i/10,k=k*10) { int w=i%10; for(int j=1;j<w;++j) { if(dp(x-j*k)==1) fail[x]=-1; } if(w==0) { if(dp(i/10)==1) fail[x]=-1; continue; } if(i>=10) { if(dp(x-w*k)==1) fail[x]=-1; } } if(fail[x]==0) fail[x]=1; return fail[x]; } int main() { //freopen("data.txt","r",stdin); memset(fail,0,sizeof(fail)); char s[10]; while(gets(s)) { if(s[0]=='0') {printf("Yes\n");continue;} int k=1; for(int i=0;s[i]!='\0';++i) { k=k*10+s[i]-'0'; } if(dp(k)==1) printf("No\n"); else printf("Yes\n"); } return 0; }