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
Sample Output
AC代码 记忆化搜索
一开始有一个大小为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代码 记忆化搜索
相关文章推荐
- 51Nod-1831-小C的游戏
- 51nod 1831: 小C的游戏(Bash博弈 找规律)
- 51nod 1831 小C的游戏
- 51nod 1831:小C的游戏
- 51nod-1831 小C的游戏
- 51Nod 1831 小C的游戏
- 51nod 1534 棋子游戏(简单博弈)
- 【51nod】1066 Bash游戏
- 51Nod 1067 Bash游戏 V2 找规律
- 51nod 1185 威佐夫游戏 V2 (用乘法模拟解决大数精度问题)
- 51Nod-1459 迷宫游戏(dij算法)
- 51Nod-1072-威佐夫游戏
- 51NOD 1661 黑板上的游戏(博弈 找规律)——算法马拉松17(告别奥运)
- 51nod-1661 1661 黑板上的游戏(组合游戏)
- 51nod 1441:士兵的数字游戏
- 51nod 1072 威佐夫游戏V1
- 51nod 1072 博弈 威佐夫游戏
- 51nod-1381 硬币游戏
- 51nod 1459 迷宫游戏 (最短路)
- 51nod 1459 迷宫游戏