专栏文章
题解:P1839 Play with Power
P1839题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqr4422
- 此快照首次捕获于
- 2025/12/04 09:22 3 个月前
- 此快照最后确认于
- 2025/12/04 09:22 3 个月前
我的思路和大佬差不多,也是记忆化搜索。
数组用来存储当初始 , 为 , 时,先手的人的胜负情况, 表示先手的人赢, 表示先手输, 表示平局。
和 表示下一个人胜负情况,若两个均胜,则本次先手的人必输,若有至少一个为负,因为是最优策略,则本次必胜。
当 时,因为 的任何次幂都为 ,所以两个人会无限的执行 ,只能平局。
当 时,如果 超过 最大值,也要判断一下。
希望上述内容可以帮助大家理解。
最后,献上蒟蒻的代码:
CPP#include<bits/stdc++.h>
using namespace std;
string s;
int n,t,a,b;
int ans[114514][30];
int dfs(int x,int y){
if(x==1&&y>27){
return 3;// 当b>27时,2^27>1e8,所以只能加b,但是1的任何次幂都是1,所以只能平局
}
if(y==1&&x>n/x){
return ((n-x)&1)?1:2;//当b=1时,若a^2>n,则只能a+1,若n-a为偶数,则 S胜,反之M胜 。
}
if(ans[x][y]){
return ans[x][y];//已经有了这个状态,直接返回即可 。
}
if(n<pow(x,y)){
return 1;
}
int xx=dfs(x+1,y),yy=dfs(x,y+1); //题解里面已经说了。
if(xx==1&&yy==1){
return ans[x][y]=2;
}else if(xx==2||yy==2){
return ans[x][y]=1;
}else{
return ans[x][y]=3;
}
}
signed main(){
cin>>n>>t;
ans[1][27]=3;
for(int i=1;i<=t;i++){
scanf("%d%d",&a,&b);
int temp=dfs(a,b);
if(temp==1){
printf("Masha\n");
}else if(temp==2){
printf("Stas\n");
}else if(temp==3){
printf("Missing\n");
}
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...