[恢]hdu 1517
2011-12-23 07:30:49
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1517
题意:S和O玩游戏,S先动。一开始P=1,每次让它乘以2或9,超过n的获胜。问最后谁赢。
mark:虽然是博弈。。。但是貌似很麻烦,直接记忆化爆之。。。
代码:
# include <stdio.h>
# include <string.h>
int dp[40][40] ;
long long n ;
long long pow(int a, int b)
{
long long ans = 1 ;
int i ;
for (i = 0 ; i < b ; i++)
ans *= (long long)a ;
return ans ;
}
int dfs(int f2, int f9)
{
if (dp[f2][f9] != -1) return dp[f2][f9] ;
if (pow(2,f2) * pow(9,f9) >= n) return dp[f2][f9] = 0 ;
if (dfs (f2+1, f9)==0 || dfs (f2,f9+1) ==0)
return dp[f2][f9] = 1 ;
return dp[f2][f9] = 0 ;
}
int main ()
{
while (~scanf ("%I64d", &n))
{
memset (dp, -1, sizeof(dp)) ;
dfs (0,0) ;
puts (dp[0][0]? "Stan wins." : "Ollie wins.") ;
}
return 0 ;
}