转载请注明出处,谢谢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的局面。

两种情况都处理一下,如果有必胜,肯定先手胜,否则如果有平局,则考虑平局,否则先手败。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <map>
  5. #include <vector>
  6. #include <string>
  7. #include <queue>
  8. #include <cmath>
  9. #include <algorithm>
  10. #define Key_value ch[ch[root][1]][0]
  11. using namespace std;
  12. typedef long long LL;
  13. const int N = 35000;
  14. const int M = 31;
  15. int a , b , n , dp[N][M];
  16. // a ^ b >= n ? true : false
  17. bool check (int a , int b , int n) {
  18. LL ret = 1LL;
  19. for (int i = 0 ; i < b ; i ++) {
  20. ret = ret * a;
  21. if (ret <= 0 || ret >= n)
  22. return true;
  23. }
  24. return false;
  25. }
  26. int dfs (int a , int b) {
  27. if (dp[a][b] != -1) return dp[a][b];
  28. if (check (a , b , n)) {
  29. return dp[a][b] = 1;
  30. }
  31. int ret = 0;
  32. ret |= ! dfs (a + 1 , b);
  33. ret |= ! dfs (a , b + 1);
  34. return dp[a][b] = ret;
  35. }
  36. bool b_is_one (int a , int b = 1) {
  37. int up = sqrt (n - 0.0000001);
  38. int turn = 0;
  39. while (a <= up) {
  40. if (dp[a][b + 1] == 0) {
  41. return turn == 0;
  42. }
  43. a ++;turn = 1 - turn;
  44. }
  45. int remain = n - 1 - a;
  46. turn = (turn + remain) % 2;
  47. return turn;
  48. }
  49. int a_is_one (int b , int a = 1) {
  50. if (check (a , b , n)) return 0;
  51. else {
  52. int turn = 0;
  53. for ( ; !check (2 , b , n) ; b ++) {
  54. if (dp[a + 1][b] == 0) {
  55. if (turn == 0) return 1;
  56. else return -1;
  57. }
  58. turn = 1 - turn;
  59. }
  60. return 0;
  61. }
  62. }
  63. int main () {
  64. #ifndef ONLINE_JUDGE
  65. freopen ("input.txt" , "r" , stdin);
  66. // freopen ("ouput.txt" , "w" , stdout);
  67. #endif
  68. memset (dp , -1 , sizeof (dp));
  69. cin >> a >> b >> n;
  70. if (check (a , b , n)) {
  71. puts ("Masha");
  72. return 0;
  73. }
  74. for (int i = 2 ; i < N ; i ++) {
  75. for (int j = 2 ; j < M ; j ++) {
  76. dp[i][j] = dfs (i , j);
  77. }
  78. }
  79. if (a !=1 && b != 1) {
  80. puts (dp[a][b] ? "Masha" : "Stas");
  81. return 0;
  82. }
  83. if (a == 1 && b == 1) {
  84. int c = a_is_one (b + 1) , d = b_is_one (a + 1);
  85. if (c < 0 || d == 0) puts ("Masha");
  86. else if (c == 0) puts ("Missing");
  87. else puts ("Stas");
  88. }
  89. else if (b == 1) {
  90. puts (b_is_one (a) ? "Masha" : "Stas");
  91. }
  92. else if (a == 1) {
  93. int c = a_is_one(b);
  94. if (c == 0) puts ("Missing");
  95. else if (c == 1) puts ("Masha");
  96. else puts ("Stas");
  97. }
  98. return 0;
  99. }

CF 39E What Has Dirichlet Got to Do with That? (博弈)的更多相关文章

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

    传送门 解题思路 首先很好写出一个\(O(ab)\)的记搜,但发现这样无法处理\(a=1\)和\(b=1\)的情况,这两种情况需要特判.首先\(a=1\)的情况,就是如果当前选手让\(a+1\)必胜, ...

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

    主题链接:点击打开链接 意甲冠军: 特定 a一箱 b球 不变n (球和箱子都不尽相同,样的物品) 设 way = 把b个球放到a个箱子中的方法数, 若way >= n则游戏结束 有2个人玩游戏. ...

  3. 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  ...

  4. [UOJ Round#4 A] [#51] 元旦三侠的游戏 【容斥 + 递推】

    题目链接:UOJ - 51 据说这题与 CF 39E 类似. 题目分析 一看题目描述,啊,博弈论,不会!等待爆零吧... 这时,XCJ神犇拯救了我,他说,这题可以直接搜啊. 注意!是用记忆化搜索,状态 ...

  5. NOI2019网络同步赛游记

    我发的邮件**f没收到,后来去专门询问才整到一个名额(估计是嫌我太菜,参加了也是垫底) day -1 上午写了到类似随机游走的高斯消元期望dp,然后颓颓颓 下午打洛咕月赛.T1一直50pts,后来才知 ...

  6. 开源推荐系统Librec中recommender模块算法了解——cf模块

    1.      k近邻(k-NearestNeighbor)算法介绍及在推荐系统中的应用 https://zhuanlan.zhihu.com/p/25994179 k近邻(k-NearestNeig ...

  7. spark MLlib 概念 4: 协同过滤(CF)

    1. 定义 协同过滤(Collaborative Filtering)有狭义和广义两种意义: 广义协同过滤:对来源不同的数据,根据他们的共同点做过滤处理. Collaborative filterin ...

  8. 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 ...

  9. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

随机推荐

  1. ofbiz ins

  2. ios block使用

    BlockTest.h #import <Foundation/Foundation.h> typedef void (^didFinishBlock)(NSString *str); t ...

  3. Number of Parallelograms(求平行四边形个数)

    Number of Parallelograms time limit per test 4 seconds memory limit per test 256 megabytes input sta ...

  4. [置顶] LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件,生成mysql的LOAD语句

    LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件,生成mysql的LOAD语句 declare @sql varchar(4000), @dirpath varch ...

  5. Android应用程序注冊广播接收器(registerReceiver)的过程分析

    前面我们介绍了Android系统的广播机制,从本质来说,它是一种消息订阅/公布机制,因此,使用这样的消息驱动模型的第一步便是订阅消息:而对Android应用程序来说,订阅消息事实上就是注冊广播接收器, ...

  6. Hacker(12)----个人计算机安全防护策略

    了解了黑客的常用入侵方法,针对这些方法分别指定对应的防护策略不太现实,因此用户只能掌握个人计算机安全的常见防护策略,以确保计算机处在一个相对安全的环境中.常见个人计算机防护策略有:安装并及时升级杀毒软 ...

  7. RMAN-使用catalog恢复目录进行备份与恢复

    RMAN ArchitectureThe RMAN architecture, shown in Figure 7-3, includes a target database, repository, ...

  8. EXPDP和IMPDP简单测试

    一.EXPDP和IMPDP使用说明  Oracle Database 10g引入了最新的数据泵(Data Dump)技术,数据泵导出导入(EXPDP和IMPDP)的作用 1)实现逻辑备份和逻辑恢复.  ...

  9. 学习笔记DAY2

    Pycharm使用 1.添加模板 file => settings =>Editor=>file and code template => python script => ...

  10. Xcode 常用快捷键及代码自动排版 二

    Xcode常用快捷键,网上找的总结一下,特别是格式化代码 隐藏xcode command+h退出xcode command+q关闭窗口 command+w关闭所有窗口 command+option+w ...