转自大佬博客:https://www.cnblogs.com/NaVi-Awson/p/8405966.html;

题意

两个人 Van♂ 游戏,每人手上各有 8'>88 张牌,牌上数字均为 [0,4]'>[0,4][0,4] 之间的数。每个人在自己的回合选自己手牌中数字不为 0'>00的一张与对方手牌中不为 0'>00 的一张。数字相加对 5'>55 取模,赋给自己当前选中的这张牌。 T'>TT 组询问,给出先手,问谁能胜。

分析

首先注意到卡牌顺序是没有影响的,我们可以按数字大小排序。这时由可重复的组合得每个人可能的方案只有 495(8+5−18)=495 种。所以两个人不同的状态共 4952=2450254952=245025 种。

我们可以将每个状态抽象成节点,节点存下两个状态,改轮的操作者的状态和对方的状态。用有向边链接操作前的和操作后的情况。对于每个节点我们考虑其连向的所有节点:

  1. 若存在一个连向的节点的状态能够保证当前的后手必败,那么改轮的操作者必胜;
  2. 若其连向的所有节点都是必胜,该节点必败;
  3. 其余的情况,则是平局

可以反向建边然后跑topsort

PS:我会说大佬这篇博客让我的编码状态姿势大幅度提高了吗~

  //It is made by Awson on 2018.2.2
#include <bits/stdc++.h>
#define LL long long
#define dob complex<double>
#define Abs(a) ((a) < 0 ? (-(a)) : (a))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Swap(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b))
#define writeln(x) (write(x), putchar('\n'))
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int N = ;
void read(int &x) {
char ch; bool flag = ;
for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || ); ch = getchar());
for (x = ; isdigit(ch); x = (x<<)+(x<<)+ch-, ch = getchar());
x *= -*flag;
}
void print(int x) {if (x > ) print(x/); putchar(x%+); }
void write(int x) {if (x < ) putchar('-'); print(Abs(x)); } int S[N+], C[N+], cnt;
struct hs {
int a[];
hs() {memset(a, , sizeof(a)); }
hs(int x) {for (int i = ; i >= ; i--) a[i] = x%, x /= ; }
hs(int *_a) {for (int i = ; i < ; i++) a[i] = _a[i]; }
void rd() {for (int i = ; i < ; i++) read(a[i]); }
void st() {sort(a, a+); }
int hash() {
int ans = ;
for (int i = ; i < ; i++) ans = ans*+a[i];
return ans;
}
};
struct tt {int to, next; }edge[(N<<)+];
int path[N+], top, in[N+], ans[N+]; void add(int u, int v) {++in[v]; edge[++top].to = v, edge[top].next = path[u]; path[u] = top; }
int no(int a, int b) {return (a-)*cnt+b-; }
void dfs(int cen, int last, int h) {
if (cen == ) {S[++cnt] = h, C[h] = cnt; return; }
for (int i = last; i < ; i++) dfs(cen+, i, h*+i);
}
void prework() {
dfs(, , );
for (int i = ; i <= cnt; i++)
for (int j = ; j <= cnt; j++) {
hs a(S[i]), b(S[j]);
for (int p = ; p < ; p++) if (a.a[p])
for (int q = ; q < ; q++) if (b.a[q]) {
hs c(a.a);
c.a[p] = (a.a[p]+b.a[q])%;
c.st(); int tmp = C[c.hash()];
add(no(j, tmp), no(i, j));
}
}
queue<int>Q; while (!Q.empty()) Q.pop();
for (int i = ; i <= cnt; i++) ans[no(i, )] = , Q.push(no(i, ));
while (!Q.empty()) {
int u = Q.front(); Q.pop();
for (int i = path[u]; i; i = edge[i].next) if (!ans[edge[i].to]) {
if (ans[u] == ) {ans[edge[i].to] = -; Q.push(edge[i].to); }
else if (--in[edge[i].to] == ) {
Q.push(edge[i].to); ans[edge[i].to] = ;
}
}
}
}
void work() {
prework();
int t, f; hs a, b; read(t);
while (t--) {
read(f); a.rd(), b.rd(); a.st(); b.st();
if (f) swap(a, b);
int as = ans[no(C[a.hash()], C[b.hash()])];
if (as == ) puts("Deal");
else if (as == - && f || as == && !f) puts("Bob");
else puts("Alice");
}
}
int main() {
work();
return ;
}

Codeforces 919F——A Game With Numbers的更多相关文章

  1. Codeforces 919F. A Game With Numbers(博弈论)

      Imagine that Alice is playing a card game with her friend Bob. They both have exactly 88 cards and ...

  2. [Codeforces 919F]A Game With Numbers

    Description 题库链接 两个人 Van♂ 游戏,每人手上各有 \(8\) 张牌,牌上数字均为 \([0,4]\) 之间的数.每个人在自己的回合选自己手牌中数字不为 \(0\) 的一张与对方手 ...

  3. 【题解】 Codeforces 919F A Game With Numbers(拓扑排序+博弈论+哈希)

    懒得复制,戳我戳我 Solution: 我感觉我也说不太好,看Awson的题解吧. 说一点之前打错的地方: 连边存的是hash后的数组下标 if(ans[ num( C[a.hash()] , C[b ...

  4. Codeforces 385C Bear and Prime Numbers

    题目链接:Codeforces 385C Bear and Prime Numbers 这题告诉我仅仅有询问没有更新通常是不用线段树的.或者说还有比线段树更简单的方法. 用一个sum数组记录前n项和, ...

  5. Codeforces 385C Bear and Prime Numbers(素数预处理)

    Codeforces 385C Bear and Prime Numbers 其实不是多值得记录的一道题,通过快速打素数表,再做前缀和的预处理,使查询的复杂度变为O(1). 但是,我在统计数组中元素出 ...

  6. Educational Codeforces Round 2 A. Extract Numbers 模拟题

    A. Extract Numbers Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/600/pr ...

  7. Educational Codeforces Round 8 D. Magic Numbers 数位DP

    D. Magic Numbers 题目连接: http://www.codeforces.com/contest/628/problem/D Description Consider the deci ...

  8. codeforces 556B. Case of Fake Numbers 解题报告

    题目链接:http://codeforces.com/problemset/problem/556/B 题目意思:给出 n 个齿轮,每个齿轮有 n 个 teeth,逆时针排列,编号为0 ~ n-1.每 ...

  9. codeforces 446C DZY Loves Fibonacci Numbers(数学 or 数论+线段树)(两种方法)

    In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence relation F1 ...

随机推荐

  1. wlan经常掉线怎么办?

    有没有这样的情款,好好的网络总是突然断掉然,之后就需要重新连接,连接以后没多久有需要重新连接.本次经验就来和大家一起分享一下几种情况的解决方法,非常的简单实用. 工具/原料 电脑 电源设置问题 1.本 ...

  2. MATLAB的一些应用--最近用的比较多

    MATLAB的一些应用--最近用的比较多 1.MATLAB分析信号的频谱 快速Fourier变换(FFT)是离散傅里叶变换的快速算法,他是根据离散傅里叶变换的奇.偶.虚.实等特性,对离散傅里叶变换的算 ...

  3. iOS 10 隐私权限设置

    iOS 10 开始对隐私权限更加严格,如果你不设置就会直接崩溃,现在很多遇到崩溃问题了,一般解决办法都是在info.plist文件添加对应的Key-Value就可以了. 以上Value值,圈出的红线部 ...

  4. Eclipse 进入前选择Workspace

    如果选择了默认的Workspace会有一个问题. 打开一个workspace的时候,再次打开eclipse会报错,提示当前workspace正在被使用,然后让选择workspace. 最好的方法是每次 ...

  5. ecshop其他页面判断是智能手机访问也跳转到ECTouch对应手机版页面(转)

    ecshop 其他页面(商品详情页.商品分类页.团购页.优惠活动页.积分商城) 判断如果是智能手机访问跳转到ECTouch1.0手机版对应页面 方法 首先在ecshop 根目录下 includes/l ...

  6. 不让activity显示UI的办法

    直接把 //setContentView(R.layout.activity_welcome); 注释掉就是了

  7. 让你的 Nginx 的 RTMP 直播具有统计某频道在线观看用户数量的功能

    你的 Nginx 已经有了 RTMP 直播功能的话,如果你还想统计某直播频道当前观看用户量的话,可以加入 with-http_xslt_module 模块.具体步骤如下:        1.查看原来的 ...

  8. xunsearch基本使用

    目录 基本实践 异常捕获 XSDocument 文档 添加操作 ini 更新.修改文档 删除文档 清空索引 平滑重建索引 使用索引缓冲区 自定义 SCWS 词库 基本实践 <?php // 引入 ...

  9. linux输入子系统之按键驱动

    上一节中,我们讲解了Linux  input子系统的框架,到内核源码里详细分析了输入子系统的分离分层的框架等. 上一节文章链接:http://blog.csdn.net/lwj103862095/ar ...

  10. C Primer Plus学习笔记(十一)- 存储类别、链接和内存管理

    存储类别 从硬件方面来看,被储存的每个值都占用一定的物理内存,C 语言把这样的一块内存称为对象(object) 对象可以储存一个或多个值.一个对象可能并未储存实际的值,但是它在储存适当的值时一定具有相 ...