dfs更新sg函数,数据long long,采用map处理;
//sg函数打表,递归实现过程
#include<map>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int num=100;
map<LL,bool>sg;
map<LL,bool>vis;
bool dfs(LL x,LL n)//x是当前状态,n是目标状态
{
if(x>=n) return sg[x]=false;//面临当前局势选择时,已经被全部选完,不能再选
if(vis.find(x)!=vis.end()) return sg[x];//之前判断过这个局势,返回判断的结果;
vis[x]=true;//标记该局势已经被判断过
//递归该局势的下一局势,由下一局势判断该局势的胜或者败
//该局势的下一个局势只要有一个是可以胜的,那么该局势都是失败的;
//该局势获胜的最大希望就是*9;所以递归从2到9;保证再选择2失败,选择9成功时;
//正确更新该局势为胜利
for(int i=2;i<=9;i++)
{
if(!dfs(x*i,n)) return sg[x]=true;
}
//在上一层循环中没有退出,说明无论x*i,当前面临的(x)都是失败的局势;
return sg[x]=false;
}
int main()
{
LL n;
while(scanf("%lld",&n)!=EOF)
{
sg.clear();vis.clear();
dfs(1,n);
printf(sg[1]?"Stan wins.\n":"Ollie wins.\n");
}
return 0;
}
//sg函数打表,递归实现过程
#include<map>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int num=100;
map<LL,int>sg;
map<LL,bool>vis;
LL dfs(LL x,LL n)//x是当前状态,n是目标状态
{
if(x>=n) return sg[x]=false;//面临当前局势选择时,已经被全部选完,不能再选
if(vis.find(x)!=vis.end()) return sg[x];//之前判断过这个局势,返回判断的结果;
vis[x]=true;//标记该局势已经被判断过
//递归该局势的下一局势,由下一局势判断该局势的胜或者败
//该局势的下一个局势只要有一个是可以胜的,那么该局势都是失败的;
//该局势获胜的最大希望就是*9;所以递归从2到9;保证再选择2失败,选择9成功时;
//正确更新该局势为胜利
bool book[11];
memset(book,0,sizeof(book));
for(int i=2;i<=9;i++)
{
book[dfs(i*x,n)]=true;
}
for(int i=0;i<=9;i++)
{
if(!book[i]){
return sg[x]=i;
}
}
//在上一层循环中没有退出,说明无论x*i,当前面临的(x)都是失败的局势;
}
int main()
{
LL n;
while(scanf("%lld",&n)!=EOF)
{
sg.clear();vis.clear();
dfs(1,n);
printf("sg==%lld\n",sg[1]);
printf(sg[1]?"Stan wins.\n":"Ollie wins.\n");
}
return 0;
}