题意:
给你一个a^b,你可以底加1,或者幂加1,当a^b>=n使,你就输了。
POINT:
DFS搜。分情况讨论。
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <string>
#include <algorithm>
using namespace std;
#define LL long long
const LL maxn = 1234 + 10;
#define INF 0x3f3f3f3f
LL cnt=0;
LL dp[50000][50];
LL sq[50000][50];
//1 first win
LL dfs(LL a,LL b,LL n)
{
if(sq[a][b]>=n){
return dp[a][b]=1;
}
if(b==1&&sq[a][2]>=n){//只能加底,那就直接判断奇偶
return dp[a][b]=(n-a-1)%2==0?2:1;
}
if(a!=1&&dfs(a,b+1,n)==2)//底为1的话,就会死循环
return dp[a][b]=1;
if(dfs(a+1,b,n)==2||dfs(a,b+1,n)==2)//两种情况任意一种输了
return dp[a][b]=1;//那么当前赢了
return dp[a][b]=2;
}
LL a,b,n;
void init()
{
for(LL i=1;i<=49000;i++){
LL now = 1;
LL j ;
for(j=1;j<=40;j++){
now=now*i;
if(now>n+12312311233){
break;
}else{
sq[i][j]=now;
}
}
for(;j<=40;j++){
sq[i][j]=n+12312311233;
}
}
}
int main()
{
scanf("%lld%lld%lld",&a,&b,&n);
init();
if(a==1&&sq[a+1][b]>=n){
printf("Missing\n");
}else{
if(dfs(a,b,n)==1){
printf("Masha\n");
}else{
printf("Stas\n");
}
}
return 0;
}