题面

题面

题解

首先我们知道一个关于除法的重要性质:对于一个固定的\(i\),表达式\(\frac{i}{m}\)的取值只有根号个。

因此我们考虑如何优化SG函数的求解。

观察到在取值相同的同一段中,分完之后只会有m堆取值为x 或者x + 1的石子。

因此我们不需要知道每种取值的石子具体有多少,我们只需要知道它们的堆数是奇是偶即可。

同时我们知道,在同一段中,如果m变化1,那么会产生的结果就是有x堆取值为x + 1的石堆变为取值为x,并且新增一堆取值为x的石堆。

我们稍作分析:

  • 如果x是奇数。

    那么由x + 1的石堆变成的x的石堆一共有x个,再加上新增的一个取值为x的石堆,就一共多出了x + 1个石堆,因为x是奇数,所以取值为x的石堆奇偶没有变化。

    而取值为x + 1的石堆减少了x个,因此奇偶性发生变化。

  • 如果x是偶数

    由跟上面类似的推导可得,取值为x的石堆奇偶性发生变化。取值为x + 1的石堆不发生变化。

因此对于同一段而言,后继SG值最多2种。

所以我们SG值单次转移复杂度\(\sqrt{n}\),总复杂度\(n\sqrt{n}\)

#include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 101000 int T, F, n;
int SG[AC];
bool z[AC]; inline int read()
{
int x = 0;char c = getchar();
while(c > '9' || c < '0') c = getchar();
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x;
} void dfs(int x)
{
if(z[x]) return ;
z[x] = true;
if(x < F) {SG[x] = 0; return ;}
bool vis[840];//因为后继状态最多六七百,所以SG不会超过800
memset(vis, 0, sizeof(vis));
for(R i = 2, lim, k, k1, k2, tmp; i <= x; i = lim + 1)
{
lim = min(x, x / (x / i)), k = x / i, dfs(k), dfs(k + 1);
k2 = x % i, k1 = i - k2, k2 %= 2, k1 %= 2;//有x % i堆k + 1,m - (x % i)堆k
tmp = (k1 * SG[k]) ^ (k2 * SG[k + 1]), vis[tmp] = 1;//对2取模,结果为1才计入贡献
if(i + 1 > lim) continue;//如果这一段就只有i这一个数,那就不能统计下面的
/*if(k & 1) vis[tmp ^ SG[k]] = true;//如果k是奇数
else vis[tmp ^ SG[k + 1]] = true;*/
++ i, k2 = x % i, k1 = i - k2, k2 %= 2, k1 %= 2;//有x % i堆k + 1,m - (x % i)堆k
tmp = (k1 * SG[k]) ^ (k2 * SG[k + 1]), vis[tmp] = 1;//懒得再分析了……直接再做一次吧
}
for(R i = 0; i <= 830; i ++)
if(!vis[i]) {SG[x] = i; break;}
} void work()
{
T = read(), F = read();
while(T --)
{
n = read();int ans = 0;
for(R i = 1; i <= n; i ++)
{
int x = read();
dfs(x), ans ^= SG[x];
}
printf("%d ", ans != 0);
}
printf("\n");
} int main()
{
// freopen("in.in", "r", stdin);
work();
// fclose(stdin);
return 0;
}

[HNOI2014]江南乐 博弈论的更多相关文章

  1. 【bzoj3576】[Hnoi2014]江南乐 博弈论+SG定理+数学

    题目描述 两人进行 $T$ 轮游戏,给定参数 $F$ ,每轮给出 $N$ 堆石子,先手和后手轮流选择石子数大于等于 $F$ 的一堆,将其分成任意(大于1)堆,使得这些堆中石子数最多的和最少的相差不超过 ...

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

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

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

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

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

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

  5. 【bzoj3576】[Hnoi2014]江南乐 数论分块+博弈论

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

  6. bzoj 3576: [Hnoi2014]江南乐【博弈论】

    这个东西卡常--预处理的时候要先把i%j,i/j都用变量表示,还要把%2变成&1-- 首先每一堆都是不相关子游戏,所以对于每一堆求sg即可 考虑暴力枚举石子数i,分割块数j,分解成子问题求xo ...

  7. luogu P3235 [HNOI2014]江南乐

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

  8. bzoj3576: [Hnoi2014]江南乐

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

  9. [HNOI2014]江南乐

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

随机推荐

  1. Android:制作聊天气泡点9图

    步骤一:选择res下的一张图片,右击选择“Create 9-Patch File” 步骤二:确定点9图的名字,只能修改.9.png之前的信息 步骤三:在同目录下会生成刚才创建的点9图,双击打开进行编辑 ...

  2. windows下安装,配置redis以及可视化客户端redisClient的安装及基本使用

    一. Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases. Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情 ...

  3. [Vani有约会]雨天的尾巴 线段树合并

    [Vani有约会]雨天的尾巴 LG传送门 线段树合并入门好题. 先别急着上线段树合并,考虑一下这题的暴力.一看就是树上差分,对于每一个节点统计每种救济粮的数量,再一遍dfs把差分的结果统计成答案.如果 ...

  4. javaweb(二十一)——JavaWeb的两种开发模式

    一.JSP+JavaBean开发模式 1.1.jsp+javabean开发模式架构 jsp+javabean开发模式的架构图如下图(图1-1)所示

  5. Java 验证码识别库 Tess4j 学习

    Java 验证码识别库 Tess4j 学习 [在用java的Jsoup做爬虫爬取数据时遇到了验证码识别的问题(基于maven),找了网上挺多的资料,发现Tess4j可以自动识别验证码,在这里简单记录下 ...

  6. Python+MySQL开发医院网上预约系统(课程设计)二

    ---恢复内容开始--- 1:报错 1.1.创建表时报错 CREATE TABLE Admin (        A_ID VARCHAR(20) NOT NULL AUTO_INCREMENT, p ...

  7. 3.5星|《哈佛商学院最受欢迎的领导课》:讲给CEO的管理学常识、常见错误和改进方法

    哈佛商学院最受欢迎的领导课 英文版出版于2011年,还不算旧.中信2013年出过一版,这版估计是英文书版权过期后重新购买了再出版. 全书以写给CEO的口吻讲了许多管理常识,包含一些CEO容易犯的问题和 ...

  8. Python基础入门(迭代器和生成器)

    1 Python迭代器 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器只能往前不会后退. 迭代器有两个基本的方法:iter() 和 ...

  9. 基于marathon-lb的服务自发现与负载均衡

    参考文档: Marathon-lb介绍:https://docs.mesosphere.com/1.9/networking/marathon-lb/ 参考:http://www.cnblogs.co ...

  10. sqlmap+tor解决ip黑名单限制

    1.安装tor浏览器(8.0.8)并配置好 旧版tor是需要Vidalia配合的,新版貌似集成了?还是怎样的,反正不需要了 2.启动tor浏览器 3.启动sqlmap python sqlmap.py ...