Digital Deletions

思路

一道博弈论的题目,考虑到题目所给的范围是字符长度为1−>61-> 61−>6,所以我们可以考虑暴力打表出10610 ^ 6106内的所有状态,

确定基本的两个状态sg[0]=1[先手胜],sg[1]=0[后手胜]sg[0] = 1[先手胜], sg[1] = 0[后手胜]sg[0]=1[先手胜],sg[1]=0[后手胜],然后再考虑其他的情况。

我们考虑单独改变某一位,假设当前枚举到第iii位,那么枚举它的所有情况,0−>num[i]−10 -> num[i] - 10−>num[i]−1,

计算改变后它的sgsgsg函数,因为这个数是变小的所以它之前的sgsgsg函数已经全部求出来了,

这个时候如果改变后的状态是必败状态,我们就可以认定这个状态为必胜状态了,

反之我们应该继续枚举它的所有状态,直到找到这个状态下的必胜,或者枚举完所有状态还是必败。

特殊情况:

  • 当这一位是0时,我们只能删去这一位,所以我们考虑如果它前面的数字构成的是必败的话,那么就可以确定这个数是必胜状态,
  • 当前到最高位时,注意这一位不能变成0,因为它的下一个状态永远是必败状态,对这个数来说没意义。

开局特殊情况:

最高位一开始就是0时,我们不用去用sg函数计算胜负,直接特判必胜。

代码

/*Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>#define mp make_pair
#define pb push_back
#define endl '\n'
#define mid (l + r >> 1)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define ls rt << 1
#define rs rt << 1 | 1using namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-')    f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x;
}const int N = 1e6 + 10;int sg[N], n;char str[10];int get_sg(int x) {int temp = x, cnt = 0, num[10] = {0}, flag = 0;while(temp) {num[++cnt] = temp % 10;temp /= 10;}for(int i = 1; i <= cnt; i++) {if(num[i] == 0) {int k = 0;for(int j = cnt; j > i; j--) {k = k * 10 + num[j];}if(!sg[k]) {flag = 1;}}else {if(i == cnt) {for(int j = 1; j < num[i]; j++) {int p = j;for(int k = cnt - 1; k >= 1; k--) {p = p * 10 + num[k];}if(!sg[p]) {flag = 1;break;}}}else {for(int j = 0; j < num[i]; j++) {int p = 0;for(int k = cnt; k >= 1; k--) {if(k == i) {p = p * 10 + j;}else {p = p * 10 + num[k];}}if(!sg[p]) {flag = 1;break;}}}}if(flag) break;}return flag;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);sg[0] = 1, sg[1] = 0;for(int i = 2; i < N; i++) {sg[i] = get_sg(i);}while(scanf("%s", str + 1) != EOF) {if(str[1] == '0') {puts("Yes");continue;}n = strlen(str + 1);int ans = 0;for(int i = 1; i <= n; i++) {ans = ans * 10 + (str[i] - '0');}puts(sg[ans] ? "Yes" : "No");}return 0;
}

HDU 1404 Digital Deletions(博弈 + SG函数打表)相关推荐

  1. 点分治问题 ----------- P3727 曼哈顿计划E[点分治+博弈SG函数打表找规律]

    题目链接 解题思路: 1.首先对于每个操作我们实际上是一个博弈问题 对于k=1的操作就是很基础的NIM游戏就是找到一条链的异或和为0 对于k=2的操作通过达打表找规律: 如果s是奇数那么偶数的SG函数 ...

  2. sg函数 hdu 1404 Digital Deletions

    题目大意; 给一个字符串,长度6以内,由0~9组成,有两个操作,每次进行一个, 把任意位上的非0的数变成一个比他小的数, 例如1256 ,对5操作,把5变成 0,1,2,3,4,中任意一个,如果该位为 ...

  3. hdu1848(sg函数打表)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1848 题意:中文题诶- 思路:直接sg函数打表就好了 代码: 1 #include <iostr ...

  4. HDU 1846-Brave Game(巴什博弈-SG函数)

    Brave Game Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  5. Fibonacci again and again HDU - 1848(尼姆博弈+SG函数的运用+SG函数详解)

    题意: 给出三堆石子(m,n,p个),两人每次只能取斐波那契数f[i]个,最先取光所有石子者取胜 题目: 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义 ...

  6. 【博弈论】博弈论入门笔记(四类基础博弈+SG函数)

    『博弈论定义』 博弈论又被称为对策论(Game Theory):是二人或多人在平等的对局中各自利用对方的策略变换自己的对抗策略,达到取胜目标的理论.博弈论是研究互动决策的理论.博弈可以分析自己与对手的 ...

  7. NIM博弈+SG函数求解

    ICG 给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移动者判负. 这个游戏可以认为是所有 Impartial Combinatorial Games 的 ...

  8. (转)博弈 SG函数

    此文为以下博客做的摘要: https://blog.csdn.net/strangedbly/article/details/51137432 ---------------------------- ...

  9. CodeForces - 850C Arpa and a game with Mojtaba(博弈+sg函数)

    题目链接:点击查看 题目大意:给出n个数,两个人轮流按照规则操作,不能操作的人即为失败,规则很简单,每次找一个质数p的k次幂,记做x=,将数组中所有包含x倍数的数都除以x,必须保证至少有一个数可以除以 ...

最新文章

  1. datasg中的数据存储情况
  2. 一个Portal处理流程
  3. Linux 永久修改主机名hostname
  4. 实现php数组编码的转换的类
  5. jekenis父子结构项目打包_全栈之DevOps系列 - 发布 Python 项目 开源/私有 包
  6. 1.Office 365系列(-)
  7. 初学者python笔记(封装、反射、类内置attr属性、包装与授权)
  8. Python+tkinter生成自动跳转到网页的二维码
  9. 软件自动化测试题,软件自动化测试模拟题.doc
  10. matlab拟合分析画不出线,lsqcurvefit曲线拟合后,用polt函数画不出拟合的图形
  11. 基于SSM的在线商城系统(最新)
  12. Atitit.远程接口 监控与木马   常用的api 标准化v2 q216
  13. FTP局域网内文件共享
  14. 计算机电源管理器怎么打开,联想电池管理如何使用_联想电源管理软件在哪里打开-win7之家...
  15. C# WPF做的漂亮的登陆界面[附源码]
  16. reset按钮失效,不能清空输入框
  17. 企业网络安全的重要性
  18. C语言之图书管理系统(功能齐全!!!)
  19. 【Books系列】之第二本书:大冰《我不》读书笔记和读后感
  20. Value ‘0000-00-00 00:00:00‘ can not be represented as java.sql.Timestamp

热门文章

  1. knex 单表查询_knex.js
  2. oracle log.xml分析,Oracle11g 中使用ADRCI 查看alert log文件(xml格式)
  3. 最高调恋爱方式,简直“公开处刑”......
  4. 数学,原来可以这么美!
  5. python画图程序没有图_python画图 - v0
  6. bpmn如何查看代码 idea_提高程序员效率的IDEA插件推荐(五大神器)
  7. 超详细图解!【MySQL进阶篇】MySQL索引原理
  8. 金蝶显示服务器异常,金蝶提示云服务器异常
  9. java new 面试_java面试30问
  10. linux sed 空间模式,整理:SED的模式空间与缓冲区及n,N,d,D,p,P,h,H,g,G,x解析...