[SPOJ IGAME Interesting Game]Nim 博弈+数位DP
2017-01-12 23:59
357 查看
[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]区间中十进制位异或值为0的个数。数位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-博弈+数位dp)
- 【SPOJ-MGAME1】Game【博弈DP】
- spoj Interesting Game (数位dp+nim博弈)
- SPOJ 20848 IGAME - Interesting Game(博弈论+数位DP)
- poj2068 Nim(博弈|dp)
- POJ 2068 NIM (博弈DP)
- poj 2068 Nim(博弈dp)
- HDU 3389 Game(博弈 Nim 找规律)
- SPOJ MYQ10 Mirror Number 数位dp
- 【spoj1182/usaco-Cow Queueing, 2003 Dec-二进制编号】数位dp
- POJ 2068 Nim (博弈和DP本是一家=-=)
- SPOJ BALNUM Balanced Numbers (数位dp)
- 携程第二场 Poj 1182 食物链(带权并查集) Poj 1948 Triangular Pastures Poj(dp二维背包) 1740 A New Stone Game(博弈)
- [数位dp] spoj 10606 Balanced Numbers
- spoj 10606 Balanced Numbers 数位dp
- 【数位DP】SPOJ 10606 BALNUM Balanced Numbers
- Mutual Training for Wannafly Union #6 [SPOJ - VECTAR1] Matrices with XOR property 二维线段树 数位dp
- SPOJ BALNUM Balanced Numbers(数位dp)
- UVa 10891 Game of Sum(经典博弈区间DP)
- 关于博弈基础知识的总结:巴什博弈(Bash Game)、威佐夫博奕(Wythoff Game)、尼姆博奕(Nim Game)