题目描述

给出\(n\)堆石子, 每次可以选择将大于某个数\(f\)一堆平均分成多个堆, 最后不能操作的失败。

题解

10pts

直接爆搜即可。

70pts

像我们对这类题目的常规操作那样,将一整个局面分为几个子游戏,然后异或起来求答案。

注意到我们现将一堆\(m\)分为\(i\)堆,那么会分成\(\lfloor \frac mi\rfloor * i\)堆大小为\(\lfloor \frac mi\rfloor\)的,\(m - \lfloor \frac mi\rfloor * i\)堆大小为\(\lfloor \frac mi\rfloor+1\)的,

我们直接暴力求每个状态的\(SG\)就好了,复杂度\(O(T\)值域\(^2)\)。

100pts

观察到一种拆分的方案\(j,j,j...j,j+1,j+1...j+1\),

在异或的过程中\(SG(j)\bigoplus SG(j)=0\),\(SG(j+1)\bigoplus SG(j+1)=0\),

那么只要考虑有奇数还是偶数个\(j\),\(j+1\)即可。

但是这样还是不够的, 我们自然而然的想到, 如果将石子堆划分为\(i\)堆 或者是\(k\)堆而且 \(\lfloor\frac{m}{i}\rfloor=\lfloor\frac{m}{k}\rfloor\)

它们的后继状态都是\(SG(\lfloor\frac{m}{i}\rfloor)\)

或者是 \(SG(\lfloor\frac{m}{i}\rfloor+1)\),

它们对答案的贡献可能是相同的, 根据上一段的论述, 这取决于 \(\lfloor\frac{m}{i}\rfloor\times i\)

和 \(\lfloor \frac{x}{i}\rfloor\times i\)的奇偶性。

如果我们手推一下, 就会发现如果 $$\lfloor\frac{m}{i}\rfloor=\lfloor\frac{m}{i+1}\rfloor=\lfloor\frac{m}{i+2}\rfloor=\cdots$$

那么\(i\)和\(i+1\)对答案的贡献是相同的, \(i+1\)和\(i+2\)堆答案的贡献相同,,相同的状态我们只需要计算一次,对于\(\frac{m}{i}\)相同的所有\(i\),我们只需要计算最小的\(i\)和\(i+1\)即可。

然后我们对这个进行数论分块即可。

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
inline int gi() {
register int data = 0, w = 1;
register char ch = 0;
while (!isdigit(ch) && ch != '-') ch = getchar();
if (ch == '-') w = -1, ch = getchar();
while (isdigit(ch)) data = 10 * data + ch - '0', ch = getchar();
return w * data;
} const int MAX_N = 1e5 + 5;
int SG[MAX_N], vis[MAX_N], T, F;
int dfs(int x) {
if (x < F) return 0;
if (~SG[x]) return SG[x];
for (int l = 2, r; l <= x; l = r + 1) {
r = (x / (x / l));
for (int j = l; j <= min(l + 1, r); j++) {
int a = x % j, b = x / j, c = j - x % j, s = 0;
if (a & 1) s ^= dfs(b + 1);
if (c & 1) s ^= dfs(b);
vis[s] = x;
}
}
for (int i = 0;; i++) if (vis[i] != x) return SG[x] = i;
} int main() {
#ifndef ONLINE_JUDGE
freopen("cpp.in", "r", stdin);
#endif
memset(SG, -1, sizeof(SG));
T = gi(), F = gi();
while (T--) {
int n = gi(), ans = 0;
for (int i = 1; i <= n; i++) ans ^= dfs(gi());
printf("%d ", (bool)ans);
}
return 0;
}

【LG3235】 [HNOI2014]江南乐的更多相关文章

  1. bzoj 3576[Hnoi2014]江南乐 sg函数+分块预处理

    3576: [Hnoi2014]江南乐 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1929  Solved: 686[Submit][Status ...

  2. 洛谷 P3235 [HNOI2014]江南乐 解题报告

    P3235 [HNOI2014]江南乐 Description 两人进行 T 轮游戏,给定参数 F ,每轮给出 N 堆石子,先手和后手轮流选择石子数大于等于 F 的一堆,将其分成任意(大于1)堆,使得 ...

  3. bzoj3576: [Hnoi2014]江南乐

    Description 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏.    游戏的规则是这样的,首先给定一 ...

  4. [HNOI2014]江南乐

    Description 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏.    游戏的规则是这样的,首先给定一 ...

  5. 洛谷P3235 [HNOI2014]江南乐(Multi-SG)

    题目描述 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏. 游戏的规则是这样的,首先给定一个数F,然后游戏系统 ...

  6. luogu P3235 [HNOI2014]江南乐

    传送门 这题又是我什么时候做的(挠头) 首先是个和SG函数有关的博弈论,SG=0则先手必败.显然一堆石子就是一个游戏,而若干堆石子的SG值就是每堆SG的异或和,所以算出每堆石子SG就能知道答案 然后怎 ...

  7. 【BZOJ】3576: [Hnoi2014]江南乐

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3576 很显然,这是一个multi-nim游戏. 注意:1.一个点的SG值就是一个不等于它的 ...

  8. 【bzoj3576】 Hnoi2014—江南乐

    http://www.lydsy.com/JudgeOnline/problem.php?id=3576 (题目链接) 题意 给出一个数$F$,然后$n$堆石子,每次操作可以把一堆不少于$F$的石子分 ...

  9. luoguP3235 [HNOI2014]江南乐 数论分块 + 博弈论

    感觉其实很水? 题目就是一个Multi SG游戏,只需要预处理出所有的\(sg\)值即可\(O(Tn)\)计算 对于计算\(sg[n]\)而言,显然我们可以枚举划分了\(x\)堆来查看后继状态 那么, ...

随机推荐

  1. Static和static block(静态块)的用法

    一.用法:是一个修饰符,用于修饰成员(成员变量 成员函数)被动态所共享 当成员被静态修饰后,就多了一种调用方式,除了可以被对象调用外,还可以直接被类名调用. 类名.静态成员 二.static特点: 1 ...

  2. python下操作redis

    python安装这里我只介绍如何在Windows上安装redis,以及接下来的实践都是在Windows上进行的.在Windows上安装python的依赖库,常用的方法有两种,第一种是直接通过pip i ...

  3. 动画的分类:属性(几何)动画、内容(视频)动画:gpu vs cpu

    属性动画通过gpu根据属性来呈现: 内容动画通过cpu解码内容按照时间呈现给gpu: (或者gpu直接解码现实?)

  4. ARM汇编之MOV指令

    http://blog.csdn.net/lsywk/article/details/8799837 一.指令格式 MOV{条件}{S}  目的寄存器,源操作数 二.指令详解 MOV指令可完成从另一个 ...

  5. ServletContextListener在Springboot中的使用

    ServletContextListener是servlet容器中的一个API接口, 它用来监听ServletContext的生命周期,也就是相当于用来监听Web应用的生命周期.今天我们就来说说如何在 ...

  6. 查找系统中jdk的位置

    查找系统中jdk的位置: [root@localhost native]# find /|grep jni_md.h /var/lib/docker/overlay2/ec7a5439382a8a6d ...

  7. saltstack安装配置(yum)

    主机规划: (主)master:192.168.25.130 (从)minion:192.168.25.131     192.168.25.132 1.yum安装: 服务端:安装master yum ...

  8. HDU 1301Jungle Roads(最小生成树 prim,输入比较特殊)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1301 Jungle Roads Time Limit: 2000/1000 MS (Java/Oth ...

  9. windows下nginx访问web目录提示403 Forbidden

    在windows下 http服务器nginx时,访问web目录提示403 Forbidden,首先需要了解nginx出现403错误是什么意思: 403 Forbidden表示你在请求一个资源文件但是n ...

  10. Python入门语法

    Python入门语法 动态变量 a=3  整数 a='abc'   a="abc"    字符串 a=3.0       小数 a=true  a=false   布尔型 a=3  ...