[HNOI 2014]江南乐
Description
给你指定一个数 \(f\) ,并给你 \(T\) 组游戏,每组有 \(n\) 堆石子, \(A,B\) 两人轮流对石子进行操作,每次你可以选择其中任意一堆数量不小于 \(f\) 的石子,平均分为 \(m\) 份(即保证最大的一堆和最小的一堆中石子数量之差不超过 \(1\) )。不能操作者负。
问先手是否有必胜策略。
\(T<100,N<100,F<100000,每堆石子数量<100000\)
Solution
首先对于组合游戏,该游戏的 \(sg\) 函数是各个组分 \(sg\) 函数的 \(nim\) 和。
其次 \(sg(x)=mex\{sg(y)|y是x的后继状态\}\) 。由这两个性质我们可以来求初始状态为 \(n\) 态还是 \(p\) 态。
设法来求 \(sg(x)\) 。
我们可以枚举分的堆数 \(i\) 。
为了使数量尽量平均,我们应该使分出来每堆的石子数量尽可能等于 \(\lfloor\frac{x}{i}\rfloor\) ,如果每一堆分到\(\lfloor\frac{x}{i}\rfloor\) 个石子,那么最后会多出 \(x\mod i\) 个石子。
考虑把这些多出来的石子分别放在分出来的石子堆中,那么有 \(x\mod i\) 堆会分到新的石子。
经过简单的计算,我们可以发现最后有 \(x\mod i\) 堆分到了 \(\lfloor\frac{x}{i}\rfloor+1\) 个石子,有 $ i-(x\mod i)$ 堆分到了 \(\lfloor\frac{x}{i}\rfloor\) 。
由数论分块的思想,对于相同的块内,后继状态 \(y\) 最多只有两种,由于相同的数异或可以抵消,我们可以通过判断 \(x\mod i\) 和 \(i-(x\mod i)\) 的奇偶性来缩小运算规模。
Code
//It is made by Awson on 2018.3.7
#include <bits/stdc++.h>
using namespace std;
const int N = 100000;
int sg[N+5], mex[N+5], t, F, n, x;
int f(int x) {
if (sg[x] != -1) return sg[x];
if (x < F) return sg[x] = 0;
sg[x] = 0;
for (int i = 2; i <= x; i = x/(x/i)+1) {
int tmp = 0;
if ((i-x%i)&1) tmp ^= f(x/i); if ((x%i)&1) tmp ^= f(x/i+1);
mex[tmp] = x;
if (i < x && (x/i == x/(i+1))) {
++i, tmp = 0;
if ((i-x%i)&1) tmp ^= f(x/i); if ((x%i)&1) tmp ^= f(x/i+1);
mex[tmp] = x;
}
}
while (mex[sg[x]] == x) ++sg[x];
return sg[x];
}
void work() {
memset(sg, -1, sizeof(sg));
scanf("%d%d", &t, &F); --t;
while (t--) {
scanf("%d", &n); int ans = 0; while (n--) scanf("%d", &x), ans ^= f(x); printf("%d ", (ans != 0));
}
scanf("%d", &n); int ans = 0; while (n--) scanf("%d", &x), ans ^= f(x); printf("%d\n", (ans != 0));
}
int main() {
work(); return 0;
}
[HNOI 2014]江南乐的更多相关文章
- BZOJ-3576 江南乐 博弈+优化
fye测试原题,高一全跪,高二学长除了CA爷似乎都A辣(逃) 3576: [Hnoi2014]江南乐 Time Limit: 30 Sec Memory Limit: 512 MB Submit: 1 ...
- bzoj 3576[Hnoi2014]江南乐 sg函数+分块预处理
3576: [Hnoi2014]江南乐 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 1929 Solved: 686[Submit][Status ...
- 【BZOJ3576】江南乐(博弈论)
[BZOJ3576]江南乐(博弈论) 题面 BZOJ 洛谷 题解 无论一堆石头怎么拆分,都并不能改变它是一个\(Multi-SG\)的事实. 既然每一组的\(F\)都是固定的,那么我们预处理所有的可能 ...
- 洛谷 P3235 [HNOI2014]江南乐 解题报告
P3235 [HNOI2014]江南乐 Description 两人进行 T 轮游戏,给定参数 F ,每轮给出 N 堆石子,先手和后手轮流选择石子数大于等于 F 的一堆,将其分成任意(大于1)堆,使得 ...
- HNOI 2014
D1T1:画框 frame 题意:给你两个n阶正整数方阵,请你求最大的\( \sum_{i = 1}^{n} A_{i, p_i}\times \sum_{i = 1}^{n} B_{i, p_i} ...
- 【LOJ】#2210. 「HNOI2014」江南乐
LOJ#2210. 「HNOI2014」江南乐 感觉是要推sg函数 发现\(\lfloor \frac{N}{i}\rfloor\)只有\(O(\sqrt{N})\)种取值 考虑把这些取值都拿出来,能 ...
- HNOI 2014 米特运输(图论)
HNOI 2014 米特运输 题目大意 给一棵树,每个点有自己的权值,要求更改一些点的权值,使得整棵树满足两个条件: 同一个父亲的所有子节点权值相同 父节点的取值为所有子节点的和 答案输出最少要更改的 ...
- 「HNOI 2014」 江南乐
\(Description\) \(n\)堆石子,每堆石子有\(s_i\)个,两个人轮流操作,每次可以将一对不少于\(F\)的石子尽量平均分成\(m\)堆,\(m\)每次自选,不能操作者输.共有\(T ...
- 图论(KM算法,脑洞题):HNOI 2014 画框(frame)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABPoAAANFCAIAAABtIwXVAAAgAElEQVR4nOydeVxTV/r/n9ertaJEC4
随机推荐
- python全栈学习--day1
计算机基础 CPU:中央处理器 内存:4GB,8GB,临时处理事务的地方,供给CPU数据. 硬盘:相当于电脑的数据库,存储着大量的数据,文件,电影等. 操作系统:执行者,支配所有关系 window ...
- spring框架学习笔记5:SpringAOP示例
1.导包: 导入spring中的这两个包 再导入其他包(网上下载): 2.准备目标对象: package service; public class UserServiceImpl implement ...
- 2017-2018-1 Java演绎法 第一周 作业
团队学习:<构建之法> [团队成员]: 学号 姓名 负责工作 20162315 马军 日常统计,项目部分代码 20162316 刘诚昊 项目部分代码,代码质量测试 20162317 袁逸灏 ...
- scrapy 数据存储mysql
#spider.pyfrom scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Ru ...
- poj 2142 The Balance
The Balance http://poj.org/problem?id=2142 Time Limit: 5000MS Memory Limit: 65536K Descripti ...
- 【作业】HansBug的前三次OO作业分析与小结
OO课程目前已经进行了三次的作业,容我在本文中做一点微小的工作. 第一次作业 第一次作业由于难度不大,所以笔者程序实际上写的也比较随意一些.(点击就送指导书~) 类图 程序的大致结构如下: 代码分析 ...
- vue 手机端开发 小商铺 添加购物车 以及结算 功能
这个功能绕了我一天!!! 对 就是这个功能 一系列相关联的 四处相关联 现在加班 没时间更 过两天在更
- 《javascript设计模式与开发实践》阅读笔记(14)—— 中介者模式
中介者模式 数个对象之间的通信全部委托一个中介者完成.适用于对象之间互相引用,关系错综复杂的情况. 什么情况下需要使用中介者模式 对象较多,且对象间会相互引用,当一个对象的某个状态改变时,得通知其他对 ...
- [洛谷P3383][模板]线性筛素数-欧拉筛法
Description 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) Input&Output Input 第一行包含两个正整数N.M,分别表示查询的 ...
- 改变textField的placeholder的颜色和位置
重写UItextField的这个方法,用其他的textField继承自这个父类 - (void) drawPlaceholderInRect:(CGRect)rect { [[UIColor blue ...