【BZOJ 4600】【SDOI 2016】硬币游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=4600
转化成nim游戏
因为对于每一个反面朝上的硬币编号可以拆成\(2^a3^bc\),选择这个硬币可以翻的其他硬币的编号必须是c的倍数。
那么如果两个单一游戏的c不同的话,只要a和b相同,那么状态的sg值也相同,所以存sg函数的状态时不用考虑c,只用考虑a和b即可。
暴力枚举子状态进行转移。
小神说这是博弈里比较水的一道题QwQ
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
int in() {
int k = 0; char c = getchar();
for(; c < '0' || c > '9'; c = getchar());
for(; c >= '0' && c <= '9'; c = getchar())
k = k * 10 + c - 48;
return k;
}
vector <int> a;
int sg[23][23][23], n, maxq;
void init(int SG[23][23]) {
int p, q, t = 0, tmp, num;
for(int i = 0; i <= 20; ++i)
for(int j = 0; j <= 20; ++j) {
a.clear();
for(p = 1; p <= i; ++p, t = 0)
for(q = 1; q <= maxq && p * q <= i; ++q) {
t ^= SG[i - p * q][j];
a.push_back(t);
}
for(p = 1; p <= j; ++p, t = 0)
for(q = 1; q <= maxq && p * q <= j; ++q) {
t ^= SG[i][j - p * q];
a.push_back(t);
}
stable_sort(a.begin(), a.end());
if (!a.size() || a[0] != 0) continue;
tmp = num = 1;
while (tmp < a.size() && a[tmp] == a[tmp - 1]) ++tmp;
while (tmp < a.size()) {
if (a[tmp] != num) {
SG[i][j] = num;
break;
}
++tmp;
while (tmp < a.size() && a[tmp] == a[tmp - 1])
++tmp;
++num;
}
if (tmp == a.size()) SG[i][j] = num;
}
}
int T, m, pw2, pw3, ans;
int main() {
for(maxq = 1; maxq <= 20; ++maxq)
init(sg[maxq]);
T = in();
while (T--) {
n = in(); maxq = in(); ans = 0;
for(int i = 1; i <= n; ++i) {
if (in()) continue;
pw2 = pw3 = 0;
m = i;
while (m % 2 == 0) ++pw2, m /= 2;
while (m % 3 == 0) ++pw3, m /= 3;
ans ^= sg[maxq][pw2][pw3];
}
puts(ans ? "win" : "lose");
}
return 0;
}
【BZOJ 4600】【SDOI 2016】硬币游戏的更多相关文章
- bzoj 2017 [Usaco2009 Nov]硬币游戏 动态规划
[Usaco2009 Nov]硬币游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 431 Solved: 240[Submit][Status] ...
- 【题解】Luogu p2964 BZOJ 2017[Usaco2009 Nov]硬币游戏
题目描述 Farmer John's cows like to play coin games so FJ has invented with a new two-player coin game c ...
- [bzoj 2017] [Usaco2009 Nov]硬币游戏
一个多月没更博客了..(期间明白了自己有多傻逼. 这种问题大概就倒着做... f[i][j]:表示考虑剩下的硬币i..n,且之前的人取了j个时,先手最多拿到的钱数.aft[i]:表示硬币i..n的总钱 ...
- bzoj 2017: [Usaco2009 Nov]硬币游戏【dp】
废了废了,一个小dp都想不出来 把c数组倒序一下,变成1在最下,设f[i][j]为某一人取完j个之后还剩1~i的硬币,转移的话应该是f[i][j]=max(s[i]-f[i-k][k]),就是1~n的 ...
- [BZOJ 4516] [SDOI 2016] 生成魔咒
Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例 ...
- 解题:SDOI 2017 硬币游戏
题面 板板的生成函数做法太神仙了,我跑了 朴素的做法是建立AC自动机变成图上的随机游走问题 来仔细考虑一下转移,把状态分成非结尾状态和结尾状态.在一个非结尾状态后补一个串是一定能到达目标串的,但是如果 ...
- [BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash)
[BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash) 题面 扔很多次硬币后,用H表示正面朝上,用T表示反面朝上,会得到一个硬币序列.比如HTT表示第一次正面朝上, ...
- BZOJ:4820: [Sdoi2017]硬币游戏&&BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)
1444: [Jsoi2009]有趣的游戏 4820: [Sdoi2017]硬币游戏 这两道题都是关于不断随机生成字符后求出现给定字符串的概率的问题. 第一题数据范围较小,将串建成AC自动机以后,以A ...
- BZOJ 1411&&Vijos 1544 : [ZJOI2009]硬币游戏【递推,快速幂】
1411: [ZJOI2009]硬币游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 897 Solved: 394[Submit][Status ...
随机推荐
- Java方法区和运行时常量池溢出问题分析
运行时常量池是方法区的一部分,方法区用于存放Class的相关信息,如类名.访问修饰符.常量池.字段描述.方法描述等. String.intern()是一个native方法,它的作用是:如果字符串常量池 ...
- stanford coursera 机器学习编程作业 exercise 3(逻辑回归实现多分类问题)
本作业使用逻辑回归(logistic regression)和神经网络(neural networks)识别手写的阿拉伯数字(0-9) 关于逻辑回归的一个编程练习,可参考:http://www.cnb ...
- 06章 Struts2国际化
1:什么是国际化? 国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式.它要求从产品中抽离所有的与语言,国家/地区和文化相关的元素.换言之,应用程序的功 ...
- 05章 OGNL
一.OGNL全称是Object Graph Navigation Language,即对象导航图语言 OGNL在框架中主要做两件事情:表达式语言和类型转换器 OGNL在框架中的作用以及数据的流入流出: ...
- 以Access为支撑,书写一个C#写入记录的案例
/// <summary> /// 读取Excel文档 /// </summary> /// <param name="Path">文件名称&l ...
- parentNode的兼容性问题
IE9下获取对象层次中的父对象,9以上获取文档层次中的父对象 <table><tr><p><td id="haha">haha< ...
- BZOJ 3309: DZY Loves Math
3309: DZY Loves Math Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 761 Solved: 401[Submit][Status ...
- Centos5.8下编译安装PHP5.4和memcached, phalcon, yaf, apc
安装GIT 需要先安装gcc-c++ (sudo yum install gcc-c++)sudo yum install gettext-devel expat-devel cpio perl op ...
- Visual Studio 2013编辑HTML文件无设计视图的解决方案
在Visual Studio 2013中编辑HTML文件,会发现没有设计视图. 解决方法:点击Visual Studio 2013的”工具“菜单,再点击”选项“—>文本编辑器—>文件扩展名 ...
- Winfrom动态创建控件
FlowLayoutPanel flowLayoutPanel1 = new FlowLayoutPanel();for (int i = 0; i < 9; i++){ Button b ...