题目描述

两人进行 $T$ 轮游戏,给定参数 $F$ ,每轮给出 $N$ 堆石子,先手和后手轮流选择石子数大于等于 $F$ 的一堆,将其分成任意(大于1)堆,使得这些堆中石子数最多的和最少的相差不超过1(即尽量均分)。求先手和后手谁必胜。

输入

输入第一行包含两个正整数T和F,分别表示游戏组数与给定的数。
接下来T行,每行第一个数N表示该组游戏初始状态下有多少堆石子。之后N个正整数,表示这N堆石子分别有多少个。

输出

输出一行,包含T个用空格隔开的0或1的数,其中0代表此时小A(后手)会胜利,而1代表小A的对手(先手)会胜利。

样例输入

4 3 
1 1 
1 2 
1 3 
1 5

样例输出

0 0 1 1


题解

博弈论+SG定理+数学

显然游戏为多状态组合游戏,考虑使用SG定理求解。

SG定理:定义每种局面的SG函数值为该局面所有子局面SG函数值的mex,多状态组合游戏的SG值为每个状态SG值的异或。SG值为0时先手必败,否则先手必胜。

设 $f[i]$ 表示一堆 $i$ 个石子的SG函数值,当 $i<f$ 时 $f[i]=0$ 。枚举分成的堆数 $j$ ,根据定义有 $f[i]=\text{mex}_{j=2}^{i}f[\frac ij]\text{^}f[\frac ij]\text{^}...\text{^}f[\frac ij]\text{^}f[\frac ij+1]\text{^}f[\frac ij+1]\text{^}...\text{^}f[\frac ij+1]$ 。
其中 $\text{^}$ 表示异或,$f[\frac ij]$ 有 $j-i\%j$ 个,$f[\frac ij+1]$ 有 $i\%j$ 个,$\%$ 表示模。

这里出现了 $\frac ij$ ,可以使用数学下底分块的方法枚举商,求出 $\frac ij$ 相等的一段区间。

由于 $x\text{^}x=0$ ,因此只需要考虑 $j-i\%j$ 和 $i\%j$ 的奇偶性即可。

又因为 $i\%j=i-j·\frac ij$ ,因此当 $\frac ij$ 为定值时,相同奇偶性的 $j$ 对应的答案相同。

具体来讲 ,$\text{mex}$ 后面的部分当 $j$ 为偶数时:$i$ 为奇数时为 $f[\frac ij]\text{^}f[\frac ij+1]$ ,否则为 $0$ ;当 $j$ 为奇数时:$i-j$ 为奇数为 $f[\frac ij+1]$ ,否则为 $f[\frac ij]$ 。

之后暴力求 $\text{mex}$ 即可(复杂度是对的)。

最后对于询问,将每堆的SG值异或即可得到最终的SG值。

时间复杂度 $O(n\sqrt n)$ 。

bzoj上比较卡常,需要使用时间戳优化来记录每个SG是否作为子状态出现。

#include <cstdio>
#include <algorithm>
using namespace std;
int f[100010] , v[100010];
inline void calc(int n , int c)
{
int i , t , last;
for(i = 2 ; i <= n ; i = last + 1)
{
t = n / i , last = n / t;
if(last / 2 > (i - 1) / 2)
{
if(n & 1) v[f[t] ^ f[t + 1]] = c;
else v[0] = c;
}
if((last + 1) / 2 > i / 2)
{
if((n - t) & 1) v[f[t + 1]] = c;
else v[f[t]] = c;
}
}
}
int main()
{
int T , c , i , n , x , val;
scanf("%d%d" , &T , &c);
for(i = c ; i < 100000 ; i ++ )
{
calc(i , i);
while(v[f[i]] == i) f[i] ++ ;
}
while(T -- )
{
scanf("%d" , &n) , val = 0;
for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &x) , val ^= f[x];
printf("%d" , (bool)val);
if(T) printf(" ");
}
return 0;
}

【bzoj3576】[Hnoi2014]江南乐 博弈论+SG定理+数学的更多相关文章

  1. bzoj3576: [Hnoi2014]江南乐

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

  2. [HNOI2014]江南乐 博弈论

    题面 题面 题解 首先我们知道一个关于除法的重要性质:对于一个固定的\(i\),表达式\(\frac{i}{m}\)的取值只有根号个. 因此我们考虑如何优化SG函数的求解. 观察到在取值相同的同一段中 ...

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

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

  4. 【BZOJ3576】江南乐(博弈论)

    [BZOJ3576]江南乐(博弈论) 题面 BZOJ 洛谷 题解 无论一堆石头怎么拆分,都并不能改变它是一个\(Multi-SG\)的事实. 既然每一组的\(F\)都是固定的,那么我们预处理所有的可能 ...

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

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

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

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

  7. luogu P3235 [HNOI2014]江南乐

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

  8. P3235 [HNOI2014]江南乐

    $ \color{#0066ff}{ 题目描述 }$ 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏. 游戏的 ...

  9. 【bzoj3576】 Hnoi2014—江南乐

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

随机推荐

  1. 20155322 2016-2017-2 《Java程序设计》实验一 Java开发环境的熟悉(macOS + Eclipse)

    20155322 2016-2017-2 <Java程序设计>实验一 Java开发环境的熟悉(macOS + Eclipse) 实验目的与内容 熟悉命令行开发环境. 使用vim等文本编译器 ...

  2. PHP 行为测试工具 Codeception (介绍)

    原文地址:https://phphub.org/topics/25 Codeception 简介 Codeception 简单来说, 分为以下几种测试 Acceptance Tests 验收测试 Fu ...

  3. runtime如何实现weak属性

    首先了解weak是一种非拥有关系,属性所值对象销毁时,属性值会清空(nil). Runtime对注册的类会进行布局,对于weak对象会放入hash表中,用weak指向的内存地址作为key,当对象引用计 ...

  4. java阻塞队列之ArrayBlockingQueue

    在Java的java.util.concurrent包中定义了和多线程并发相关的操作,有许多好用的工具类,今天就来看下阻塞队列.阻塞队列很好的解决了多线程中数据的安全传输问题,其中最典型的例子就是客园 ...

  5. python爬虫:爬取慕课网视频

    前段时间安装了一个慕课网app,发现不用注册就可以在线看其中的视频,就有了想爬取其中的视频,用来在电脑上学习.决定花两天时间用学了一段时间的python做一做.(我的新书<Python爬虫开发与 ...

  6. 强化学习读书笔记 - 12 - 资格痕迹(Eligibility Traces)

    强化学习读书笔记 - 12 - 资格痕迹(Eligibility Traces) 学习笔记: Reinforcement Learning: An Introduction, Richard S. S ...

  7. Android手机测试-ddms&monitor-抓crash,log

    1.安装adb offline解决办法: 原因就是android 4.2以上的版本过高,sdk的adb驱动不匹配,需要升级.我原本的adb是1.0.29,升级为1.0.31,问题就解决了. 2.安装s ...

  8. Ansible开发之路

    一.初识Ansible 链接:https://www.cnblogs.com/baishuchao/articles/9164083.html 二.Ansible的架构 链接:https://www. ...

  9. 虚拟货币——比特币行情价格分析

    最近挖以太币的朋友们在关注以太坊行情时,一定会发现以太币的价格对比之前上涨了不少.肯定有部分朋友想了解这次上涨的原因,我们特地为此查询了一番.因为比特币相当于虚拟货币中的黄金,它的价格波动会波及到其他 ...

  10. TW实习日记:前三天

    今天是2018年7月20号,周五.从周一开始实习到现在,终于想起来要写日记这种东西了,可以记录一下自己这一天所学所做所知也是蛮不错的.先简单总结一下自己的大学生活吧,算是多姿多彩,体验了很多东西.在大 ...