CF 39E What Has Dirichlet Got to Do with That? (博弈)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove
题意:给出a ^ b,两个人轮流操作,可以 a + 1 也可以 b + 1,谁先使得a ^ b >= n则输。
由于题目给的n并不大,1e9的范围,如果不考虑a == 1 or b == 1的情况下
a最大为sqrt (n) ,b最大为ln(n) / ln(2)。
所以我们可以处理出所有的a > 1 && b > 1的情况,dp[i][j]表示当前局面为 i ^ j下的输赢情况,记忆化搜索一下。
然后便是考虑特殊情况
如果 a == 1 && b > 1,这种情况可能导致平局,便是两个轮流只在b上操作,导致结果一直为1。
那么我们可以模拟当前是否考虑操作a,由于a > 1 && b > 1所有情况的输赢已经处理过了。
所以只要当前a + 1 , b是个必败态,则会考虑操作。否则可能是平局。当然了a也是有个上限的。直接枚举模拟就行。
如果b == 1 && a > 1,这种情况下同理。
枚举模拟当前是否考虑操作b,如果a , b + 1是个必败态,那么会考虑操作。
我们可以处理到上界sqrt (n),因为一旦 a > sqrt (n),只要操作b,便会失败。后面的局面就已经确定了。
如果 a == 1 && b == 1,先手操作a的话,便成了a > 1 && b == 1的局面,操作b的话便 成了a == 1 && b > 1的局面。
两种情况都处理一下,如果有必胜,肯定先手胜,否则如果有平局,则考虑平局,否则先手败。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <vector>
#include <string>
#include <queue>
#include <cmath>
#include <algorithm>
#define Key_value ch[ch[root][1]][0]
using namespace std;
typedef long long LL;
const int N = 35000;
const int M = 31;
int a , b , n , dp[N][M];
// a ^ b >= n ? true : false
bool check (int a , int b , int n) {
LL ret = 1LL;
for (int i = 0 ; i < b ; i ++) {
ret = ret * a;
if (ret <= 0 || ret >= n)
return true;
}
return false;
}
int dfs (int a , int b) {
if (dp[a][b] != -1) return dp[a][b];
if (check (a , b , n)) {
return dp[a][b] = 1;
}
int ret = 0;
ret |= ! dfs (a + 1 , b);
ret |= ! dfs (a , b + 1);
return dp[a][b] = ret;
}
bool b_is_one (int a , int b = 1) {
int up = sqrt (n - 0.0000001);
int turn = 0;
while (a <= up) {
if (dp[a][b + 1] == 0) {
return turn == 0;
}
a ++;turn = 1 - turn;
}
int remain = n - 1 - a;
turn = (turn + remain) % 2;
return turn;
}
int a_is_one (int b , int a = 1) {
if (check (a , b , n)) return 0;
else {
int turn = 0;
for ( ; !check (2 , b , n) ; b ++) {
if (dp[a + 1][b] == 0) {
if (turn == 0) return 1;
else return -1;
}
turn = 1 - turn;
}
return 0;
}
}
int main () {
#ifndef ONLINE_JUDGE
freopen ("input.txt" , "r" , stdin);
// freopen ("ouput.txt" , "w" , stdout);
#endif
memset (dp , -1 , sizeof (dp));
cin >> a >> b >> n;
if (check (a , b , n)) {
puts ("Masha");
return 0;
}
for (int i = 2 ; i < N ; i ++) {
for (int j = 2 ; j < M ; j ++) {
dp[i][j] = dfs (i , j);
}
}
if (a !=1 && b != 1) {
puts (dp[a][b] ? "Masha" : "Stas");
return 0;
}
if (a == 1 && b == 1) {
int c = a_is_one (b + 1) , d = b_is_one (a + 1);
if (c < 0 || d == 0) puts ("Masha");
else if (c == 0) puts ("Missing");
else puts ("Stas");
}
else if (b == 1) {
puts (b_is_one (a) ? "Masha" : "Stas");
}
else if (a == 1) {
int c = a_is_one(b);
if (c == 0) puts ("Missing");
else if (c == 1) puts ("Masha");
else puts ("Stas");
}
return 0;
}
CF 39E What Has Dirichlet Got to Do with That? (博弈)的更多相关文章
- CF 39E. What Has Dirichlet Got to Do with That?(记忆化搜索+博弈论)
传送门 解题思路 首先很好写出一个\(O(ab)\)的记搜,但发现这样无法处理\(a=1\)和\(b=1\)的情况,这两种情况需要特判.首先\(a=1\)的情况,就是如果当前选手让\(a+1\)必胜, ...
- Codeforces 39E What Has Dirichlet Got to Do with That? 游戏+内存搜索
主题链接:点击打开链接 意甲冠军: 特定 a一箱 b球 不变n (球和箱子都不尽相同,样的物品) 设 way = 把b个球放到a个箱子中的方法数, 若way >= n则游戏结束 有2个人玩游戏. ...
- codeforce -39E-What Has Dirichlet Got to Do with That?(博弈+dfs)
You all know the Dirichlet principle, the point of which is that if n boxes have no less than n + 1 ...
- [UOJ Round#4 A] [#51] 元旦三侠的游戏 【容斥 + 递推】
题目链接:UOJ - 51 据说这题与 CF 39E 类似. 题目分析 一看题目描述,啊,博弈论,不会!等待爆零吧... 这时,XCJ神犇拯救了我,他说,这题可以直接搜啊. 注意!是用记忆化搜索,状态 ...
- NOI2019网络同步赛游记
我发的邮件**f没收到,后来去专门询问才整到一个名额(估计是嫌我太菜,参加了也是垫底) day -1 上午写了到类似随机游走的高斯消元期望dp,然后颓颓颓 下午打洛咕月赛.T1一直50pts,后来才知 ...
- 开源推荐系统Librec中recommender模块算法了解——cf模块
1. k近邻(k-NearestNeighbor)算法介绍及在推荐系统中的应用 https://zhuanlan.zhihu.com/p/25994179 k近邻(k-NearestNeig ...
- spark MLlib 概念 4: 协同过滤(CF)
1. 定义 协同过滤(Collaborative Filtering)有狭义和广义两种意义: 广义协同过滤:对来源不同的数据,根据他们的共同点做过滤处理. Collaborative filterin ...
- ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'
凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
随机推荐
- 最小费用最大流模板 poj 2159 模板水题
Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15944 Accepted: 8167 Descr ...
- JS~Boxy和JS模版实现一个标准的消息提示框
面向对象的封装 面向对象一个入最重要的特性就是“封装”,将一些没有必要公开的方法和属性以特定的方式进行组装,使它对外只公开一个接口,外界在调用它时,不需要关注它实现的细节,而只要关注它的方法签名即可, ...
- 初次使用SVN心得
进入实验室, 一个项目往往需要多天多人次共同维护,所以版本控制也显得尤为关键.下面是我第一次使用SVN工具的心得体会. 首先是安装,服务器搭配方面应该是之前完成的,这里就不多讲了. 下载地址:http ...
- CI框架源代码阅读笔记3 全局函数Common.php
从本篇開始.将深入CI框架的内部.一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说.全局函数具有最高的载入优先权.因此大多数的框架中BootStrap ...
- Tomcat 内存与优化篇
Tomcat 内存与优化一.Tomcat 运行环境介绍 1.Tomcat 本身无法直接在计算机上运行,需要依赖硬件基础上的操作系统和Java虚拟机: 2.Java 程序启动时JVM都会分配一个初始内存 ...
- [J2EE框架][Debug]
注意xml头部问题 比如在xx-servlet中注意: <mvc:annotation-driven/> <context:component-scan base-package=& ...
- html_day2
总结下今天学的HTML知识.单词 跑马灯标记 <marquee></marquee>属性: direction:滚动的方向 取值:left .right. up. down b ...
- Windows - 远程桌面无证书
可以从命令行启动远程桌面,输入:mstsc /v:地址:端口 /admin
- 1.jdk、Tomcat、solr的安装和配置
1.jdk安装和配置 1)根据电脑类型,到官网下载相应的jdk版本 2)双击jdk-8u5-windows-x64.exe安装包,一直点下一步就可以了,注意记住jdk和jre的安装目录. 3)环境变量 ...
- 最近因为textview高度问题疯了疯了疯了
1.textview有\r\n什么的就算不明白,我的文本最后一个字符是\r,结果我死活算不对,最后发现了==! NSString * str = [_messageModels[indexPath.r ...