CF 39E. What Has Dirichlet Got to Do with That?(记忆化搜索+博弈论)

传送门

解题思路

  首先很好写出一个\(O(ab)\)的记搜,但发现这样无法处理\(a=1\)和\(b=1\)的情况,这两种情况需要特判。首先\(a=1\)的情况,就是如果当前选手让\(a+1\)必胜,那么他一定会给\(a+1\),否则会给\(b+1\),如果到\(2^b>n\)时,说明谁动\(a\)谁输,就是平局了,这样的话可以模拟这个过程不断给\(b+1\)即可。第二种情况是\(b=1\),这种情况一定没有平局,那么就和刚才一样模拟即可。最后一种情况是\(a=1\)并且\(b=1\),这样的话把\(a=1,b=2\)和\(a=2,b=1\)的答案都算出来,然后讨论一下。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>

using namespace std;
const int N=40005;
typedef long long LL;

int n,a,b,ans;
bool f[N][35],vis[N][35];

inline LL fast_pow(LL x,int y){
    LL ret=1;
    for(;y;y>>=1){
        if(y&1) ret=ret*x;
        x=x*x;
    }
    return ret;
}

bool dfs(int x,int y){
    if(vis[x][y]) return f[x][y];
    vis[x][y]=1; int now;
    if(fast_pow(1ll*x,y)>=n) return f[x][y]=1;
    now=(dfs(x+1,y)^1)|(dfs(x,y+1)^1);
    if(now) return f[x][y]=1;
    return f[x][y]=0;
}

int one(int a,int b){
    int ret=0,tmp=0;
    while(fast_pow(2,b)<n){
        if(!dfs(2,b)){
            if(!tmp) ret=1;
            else ret=2;
            break;
        }
        tmp^=1; b++;
    }
    return ret;
}

int two(int a,int b){
    int tmp=0,ret=0,pre=a;
    while(fast_pow(a,2)<n){
        if(!dfs(a,2)){
            if(!tmp) ret=1;
            else ret=2;
            break;
        }
        tmp^=1; a++;
    }
    if(!ret) {
        if((n-1-pre)&1) ret=1;
        else ret=2;
    }
    return ret;
}

int main(){
    scanf("%d%d%d",&a,&b,&n);
    if(a==1 && b==1){
        int now1=one(a,b+1); if(now1!=0) now1=3-now1;
        int now2=two(a+1,b); now2=3-now2;
        if(now1==1 || now2==1) puts("Masha");
        else if(now1==2 && now2==2) puts("Stas");
        else puts("Missing");
        return 0;
    }
    else if(a==1){
        ans=one(a,b);
        if(ans==1) puts("Masha");
        else if(ans==2) puts("Stas");
        else puts("Missing");
        return 0;
    }
    else if(b==1){
        ans=two(a,b);
        if(ans==1) puts("Masha");
        else if(ans==2) puts("Stas");
        return 0;
    }
    if(dfs(a,b)) puts("Masha");
    else puts("Stas");
    return 0;
}

原文地址:https://www.cnblogs.com/sdfzsyq/p/10438319.html

时间: 2024-11-05 16:30:57

CF 39E. What Has Dirichlet Got to Do with That?(记忆化搜索+博弈论)的相关文章

Codeforces 39E What Has Dirichlet Got to Do with That? 博弈+记忆化搜索

题目链接:点击打开链接 题意: 给定 a个箱子 b个球 常数n (球和箱子都是各不相同的,不会出现有一样的物品) 设 way = 把b个球放到a个箱子中的方法数, 若way >= n则游戏结束 有2个人玩游戏. 若当前轮到 X时 1. X选择增加一个箱子或增加一个球 2.若增加完后方法数>=n 则X失败 若先手必胜,则输出 Masha ,若先手必败则输出 Stas ,若为平局则输出 Missing 思路: 记忆化搜索 若当前给 a++ 或 b++都是会>=n 则当前局势必败 从其中不会&

Codeforces 39E What Has Dirichlet Got to Do with That? 游戏+内存搜索

主题链接:点击打开链接 意甲冠军: 特定 a一箱 b球 不变n (球和箱子都不尽相同,样的物品) 设 way = 把b个球放到a个箱子中的方法数, 若way >= n则游戏结束 有2个人玩游戏. 若当前轮到 X时 1. X选择添加一个箱子或添加一个球 2.若添加完后方法数>=n 则X失败 若先手必胜,则输出 Masha ,若先手必败则输出 Stas ,若为平局则输出 Missing 思路: 记忆化搜索 若当前给 a++ 或 b++都是会>=n 则当前局势必败 从当中不会>=n的局势

[UOJ Round#4 A] [#51] 元旦三侠的游戏

题目链接:UOJ - 51 据说这题与 CF 39E 类似. 题目分析 一看题目描述,啊,博弈论,不会!等待爆零吧... 这时,XCJ神犇拯救了我,他说,这题可以直接搜啊. 注意!是用记忆化搜索,状态为 (a, b) . 是这样的:我们从后面倒着推,对于一个无法再增加 a 或 b 的 (a, b) 状态,当前走的人必败.这是终止的状态. 而对于一个不是终止状态的状态 (a, b) ,可能有两种后继状态 (a + 1, b) || (a, b + 1) ,我们递归先求出这两个后继状态是必败还是必胜

【数位DP】

[总览] 通过将数拆分成一位位的进行dp(记忆化搜索),状态最基本的有:位置($pos$),最高位限制($limit$),前导零($lead$),前一位($pre$)等等,通常需要的状态视题目而定. 记忆化搜索的数组$dp$由多维构成,每一位都是一种状态的因素. [bzoj]不要62 数位$dp$入门题,$dp$数组为$dp[pos][pre][limit]$($limit$可以通过更改代码去掉这一维). [code] #include<iostream> #include<cstdio

总结与心得(持续更新)

不知道为什么,刚学的算法过了2个月就忘得一干二净,我并没有背代码啊,当时学的时候还刷了好多题来着→_→,我是不是大脑能力严重衰退了. 动态规划 单调队列 一般情况下,${dp}$方程可以搞成这样:${f_i=f_j+t_j+t_i}$,只要其中没有变量同时与${i,j}$都有关,那么我们可以用单调队列来做,单调队列里面元素的关键字就是与${j}$有关的东西${f_j+t_j}$.example:生产产品 有些比较特殊的,虽然存在同时与${i,j}$相关的函数,但是这个函数比较简单,使得已经存在在

题单二:图论500

http://wenku.baidu.com/link?url=gETLFsWcgddEDRZ334EJOS7qCTab94qw5cor8Es0LINVaGMSgc9nIV-utRIDh--2UwRLvsvJ5tXFjbdpzbjygEdpGehim1i5BfzYgYWxJmu ==========  以下是最小生成树+并查集=========================[HDU]1213         How Many Tables        基础并查集★1272         小

HYSBZ 3209: 花神的数论题

题目连接:http://www.lydsy.com/JudgeOnline/problem.php?id=3209 花神的数论题 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1148  Solved: 535[Submit][Status][Discuss] Description 背景众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦.描述话说花神这天又来讲课了.课后照例有超级难的神题啦…… 我等蒟

UVA 10817 Headmaster&#39;s Headache 状压DP

记录两个状态S1,S2分别记录哪些课程被1个人教过或2个人教过,然后记忆化搜索 UVA - 10817 Headmaster's Headache Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Problem D: Headmaster's Headache Time limit: 2 seconds The headmaster of Spr

【搭楼】(6.25-7.02) 一中集训

听说我校搞了一个集训 虽然这是强行伪装竞赛强校的行为,不过会有一些神犇来那么必须要兹瓷 然而集训内容好像和我脱节了的样子 不过总比平时天天考一些pj组难度的题要好 6.25-6.26 Delayyy篇 Day1 因为昨日打cf,所以三点多才睡(*首发紫名好开心*) 整个早上的状态都像在做梦 T1 20傻逼dp,40大力修改父亲就可以了.一开始挂了一发,因为状态不明以至于不好修改.  打完之后发现随机的极限数据可以秒出是什么节奏,然后希望能大力出奇迹.现在想来也真是too young too si