您的位置:首页 > 其它

51nod 1831 小C的游戏

2017-09-17 17:49 155 查看
小C和小L是好朋友,她们在玩一个游戏。
一开始有一个大小为n的石子堆,小C先手。
每次可以对这个石子堆拿走一个或者把这个石子堆分成等量的几份并只取其中一份(不能不变或只剩下一个)。
如果取走最后一个人的算败,请问这个游戏小C是否能胜。
Input一行表示数据组数Tcases(Tcases<=1,000)。
后面Tcases行每行一个n(n<=1,000,000,000)。Output有Tcases行对于先手获胜输出“TAK”,先手狗带输出“NIE”。Sample Input

1
5

Sample Output

NIE


#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int maxn = 1e7 + 5;
int dp[maxn];//dp[i]表示当有i个石子并且先手先取,先手能否获胜
int dfs(int x){
if(x<maxn&&dp[x]!=-1)return dp[x];
for(int i=2;i*i<=x;i++){
if((x%i==0)&&(!dfs(i)||!dfs(x/i))){
if(x<maxn)return dp[x]=1;
else return 1;
}
}
if(!dfs(x-1)){ //这里一定要放在后面
if(x<maxn)return dp[x]=1;
else return 1;
}
if(x<maxn)return dp[x]=0;
else return 0;
}
int main(){
int t,n;
memset(dp,-1,sizeof(dp));
dp[0]=0;dp[1]=0;
dp[2]=1;dp[3]=0;
cin>>t;
while(t--){
scanf("%d",&n);
if(dfs(n))cout<<"TAK"<<endl;
else cout<<"NIE"<<endl;
}
return 0;
}


AC代码 记忆化搜索
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: