[SPOJ IGAME Interesting Game]Nim 博弈+数位DP

分类:博弈 数位DP

1. 题目链接

[SPOJ IGAME Interesting Game]

2. 题意描述

Alice和Bob玩游戏,一个数字,对于其在十进制下的每一位,玩家可以选择一个数值非0的位,将这个位置的数减去一个非0的数,使得这个位置的数在操作后非负。在某个玩家操作后,所有位置的数字都变为了0,则这个玩家获胜。
假定Alice和Bob都做出最优选择,且Alice先手。
分别输出,在A,B之间,Alice能获胜的数字有多少,Bob能获胜的数字有多少。
数据范围:
T,测试样例数。
1 <= T <= 10000, 1 <= A <= B <= 1e18.

3. 解题思路

首先,很容易观察到,对于某一数字,判断是否是先手获胜还是后手获胜,就是一个裸的Nim博弈。那么,后手胜,当且仅当该数字十进制所有位异或值为0。
那么现在的问题就是,找出[A,B][A,B]区间中十进制位异或值为0<script type="math/tex" id="MathJax-Element-6">0</script>的个数。数位DP随便搞搞就好了。需要记录的状态有: 当前位pos,当前异或值status。
只要不像我一样,简单的题目犯低级错误,应该就没有什么问题啦。

4. 实现代码

#include <bits/stdc++.h>
using namespace std;typedef long long LL;
typedef long double LB;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;const int INF = 0x3f3f3f3f;
const LL INFL = 0x3f3f3f3f3f3f3f3fLL;
const LB eps = 1e-8;
const int BITS = 18 + 5; /// 十进制长度
const int STATES = 15 + 5; /// 异或值LL A, B;
int dig[BITS];
LL dp[BITS][STATES];LL dfs(int pos, int states, bool limit) {if(pos < 1) return states == 0;if(!limit && dp[pos][states] != -1) return dp[pos][states];int lst = limit ? dig[pos] : 9;LL ret = 0;for(int i = 0; i <= lst; ++i) ret += dfs(pos - 1, states ^ i, limit && (i == lst));if(!limit) dp[pos][states] = ret;return ret;
}LL solve(LL x) {int len = 0;while(x > 0) {dig[++ len] = x % 10;x /= 10;}return dfs(len, 0, true);
}int main() {
#ifdef ___LOCAL_WONZY___freopen("input.txt", "r", stdin);
#endif // ___LOCAL_WONZY___memset(dp, -1, sizeof(dp));int _; scanf("%d", &_);while(_ --) {scanf("%lld %lld", &A, &B);LL Bob = solve(B) - solve(A - 1), Alice = (B - A + 1) - Bob;printf("%lld %lld\n", Alice, Bob);}return 0;
}

[SPOJ IGAME Interesting Game]Nim 博弈+数位DP相关推荐

  1. SPOJ SORTBIT Sorted bit squence (数位DP,入门)

    题意: 给出一个范围[m,n],按照二进制表示中的1的个数从小到大排序,若1的个数相同,则按照十进制大小排序.求排序后的第k个数.注意:m*n>=0. 思路: 也是看论文的.一开始也能想到是这种 ...

  2. SPOJ KPSUM ★(数位DP)

    题意 将1~N(1<=N<=10^15)写在纸上,然后在相邻的数字间交替插入+和-,求最后的结果.例如当N为12时,答案为:+1-2+3-4+5-6+7-8+9-1+0-1+1-1+2=5 ...

  3. [数位dp] spoj 10738 Ra-One Numbers

    题意:给定x.y.为[x,y]之间有多少个数的偶数位和减去奇数位和等于一. 个位是第一位. 样例: 10=1-0=1 所以10是这种数 思路:数位dp[i][sum][ok] i位和为sum 是否含有 ...

  4. SPOJ - BALNUM Balanced Numbers(数位dp+进制转换)

    题目链接:点击查看 题目大意:给出平衡数的定义:每一个偶数出现的次数必须是奇数次,每一个奇数出现的次数必须是偶数次,求给定区间中有多少个平衡数 题目分析:数位dp,这个题目就难在怎么确定状态转移,本来 ...

  5. 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 2774  Solved: 1230 [Submit ...

  6. 不要62 ---数位DP

    题意:求m到n中不含62和4的数的个数. 题目链接 思路:数位dp模板求满足的数字或不满足的数字,刚学,就求不满足的数. #include<stdio.h> #include<str ...

  7. bzoj 3598 [ Scoi 2014 ] 方伯伯的商场之旅 ——数位DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3598 数位DP...东看西看:http://www.cnblogs.com/Artanis/ ...

  8. cojs 简单的数位DP 题解报告

    首先这道题真的是个数位DP 我们考虑所有的限制: 首先第六个限制和第二个限制是重复的,保留第二个限制即可 第五个限制在转移中可以判断,不用放在状态里 对于第一个限制,我们可以增加一维表示余数即可 对于 ...

  9. 数位DP 不断学习中。。。。

    1, HDU 2089  不要62 :http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:不能出现4,或者相邻的62, dp[i][0],表示不存在不吉 ...

最新文章

  1. JAVA教程 第六讲 Java的线程和Java Applet(二)
  2. c语言 extern_Visual C++ 6.0环境中C语言extern 变量使用过程报错
  3. 枚举ENUM的tostring() valueof()name()和values()用法
  4. linux环境变量权限不够,linux环境变量及权限的理解
  5. PostgreSQL 10.0 preview 功能增强 - 增加access method CHECK接口amcheck
  6. office 2019 visio 2016安装
  7. ATV930变频器转矩控制如何设置?
  8. 基于OXC的光电联动全光网组网方案研究与实践
  9. Java基础第三天复习
  10. 智慧园区一体化信息管理平台设计方案
  11. 【ChatGPT】GPT-4
  12. Caliburn.Micro 杰的入门教程3,事件和参数
  13. VMware安装ubuntu kylin
  14. 我用Python分析了翟天临的论文,学术还是要认真做啊
  15. 2021-05-31以及2021-06-01(从136开始) JAVA学习笔记
  16. 雪晴网上海沙龙+在线直播:如何成为数据科学家?
  17. 前端工具之Vue-Generator
  18. 犀牛软件插件-rhino插件-visual studio-创建你的第一个插件
  19. Simple-BEV: 多传感器BEV感知真正重要的是什么?(斯坦福大学最新)
  20. 【CSS】盒子模型、内边距、背景设置_03

热门文章

  1. 配合理lcd的c语言小游戏,51单片机+LCD12864做的贪食蛇和俄罗斯方块小游戏分享
  2. 给MacBook装win7遇到的坑
  3. 手撕生产者-消费者模式 | P问题、NP问题
  4. 选拨管理者的一个必要条件
  5. scikit-learn中的PCA
  6. 电子邮箱是什么?注册邮箱163、tom、qq等品牌有什么好处?
  7. 怎么将WPS转换成WORD?看完你就学会了
  8. 怎么用计算机算ess tss,计量经济学rss.tss.ess.是什么他们的..._注册计量师_帮考网...
  9. 华硕fl5600l装固态并重装系统到固态
  10. ipad pro能写python吗_这是一篇用 iPad Pro 写的 iPad Pro 评测