博弈SG打表
题意:
两个人玩乘法游戏,每个人只能乘以2~9,谁先达到>=n谁胜,先手只能乘以1.
思路:
SG的: 除 任意一步所能转移到的子局面的SG值以外的最小非负整数。
直接打表找到规律。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
using namespace std;
const int maxn = 10005;
int sg[maxn];
void SG()
{
sg[0] = 0;
for(int i = 2;i <= maxn; i++) {
set<int>s;
for(int j = 2;j <= 9; j++) {
int temp = i/j;
if(i%j) temp++;
s.insert(sg[temp]);
}
int now = 0;
while(s.count(now)) now++;
sg[i] = now;
}
}
/**
打表发现:先手1~9,19~162,325~2916必胜
满足前一个区间l,r->r*2+1,(r*2)*9
*/
int main()
{
//SG();
//freopen("in.txt","r",stdin);
int n;
while(scanf("%d",&n) != EOF) {
int l = 1,r = 9;
int flag = 1;
while(1) {
if(l <= n && n <= r) {
flag = true;
break;
}
else if(n < l) {
flag = false;
break;
}
l = r*2+1;
r = r*2*9;
}
if(flag)
printf("Stan wins.\n");
else
printf("Ollie wins.\n");
}
return 0;
}