P3235-[HNOI2014]江南乐【整除分块,SG函数】
正题
题目链接:https://www.luogu.com.cn/problem/P3235
题目大意
\(T\)组游戏,固定给出\(F\)。每组游戏有\(n\)个石头,每次操作的人可以选择一个数量不少于\(F\)的石堆并把它尽量均摊成\(M\)堆\((M>1)\)。无法操作的人输,求每组游戏是否先手必胜。
解题思路
每个石头之间互不影响,所以求出它们的\(SG\)函数然后异或起来就好了。
设\(sg_i\)表示\(i\)个石头的\(SG\)函数,然后暴力的想法是枚举\(M\)然后求答案,但是这样显然过不了。
发现对于一个\(M\)和石头数量\(n\),能产生\(n\%M\)个大小\(\lfloor\frac{n}{M}\rfloor+1\)的石头堆和\(M-n\% M\)个大小\(\lfloor\frac{n}{M}\rfloor\)的石头堆。
额,好像就可以整除分块了。每次整除分块出来的一个区间\([l,r]\),如果\(l=r\)直接计算。
如果\(l\neq r\)的情况好像比较麻烦,其实只需要考虑\(l\)和\(l+1\)就好了,因为如果再往后的奇偶性就会重复。
时间复杂度\(O(n\sqrt n)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int T,F,cnt,cl[N],sg[N];
bool v[N];
void add(int x)
{if(!v[x])cl[++cnt]=x;v[x]=1;return;}
void clear(){
while(cnt)v[cl[cnt]]=0,cnt--;
return;
}
int main()
{
scanf("%d%d",&T,&F);
for(int i=F;i<N;i++){
for(int l=2,r;l<=i;l=r+1){
r=i/(i/l);
int k=i%l,p=i/l,q=p+1;
if((k&1)&&((l-k)&1))add(sg[p]^sg[q]);
else if((k&1)&&!((l-k)&1))add(sg[q]);
else if(!(k&1)&&((l-k)&1))add(sg[p]);
else add(0);
if(l!=r){
l++;k=i%l;
if((k&1)&&((l-k)&1))add(sg[p]^sg[q]);
else if((k&1)&&!((l-k)&1))add(sg[q]);
else if(!(k&1)&&((l-k)&1))add(sg[p]);
else add(0);
}
}
while(v[sg[i]])sg[i]++;
clear();
}
while(T--){
int n,ans=0;
scanf("%d",&n);
while(n--){
int x;scanf("%d",&x);
ans^=sg[x];
}
if(ans)printf("1 ");
else printf("0 ");
}
return 0;
}
P3235-[HNOI2014]江南乐【整除分块,SG函数】的更多相关文章
- 洛谷 P3235 [HNOI2014]江南乐 解题报告
P3235 [HNOI2014]江南乐 Description 两人进行 T 轮游戏,给定参数 F ,每轮给出 N 堆石子,先手和后手轮流选择石子数大于等于 F 的一堆,将其分成任意(大于1)堆,使得 ...
- luogu P3235 [HNOI2014]江南乐
传送门 这题又是我什么时候做的(挠头) 首先是个和SG函数有关的博弈论,SG=0则先手必败.显然一堆石子就是一个游戏,而若干堆石子的SG值就是每堆SG的异或和,所以算出每堆石子SG就能知道答案 然后怎 ...
- 【bzoj3576】[Hnoi2014]江南乐 数论分块+博弈论
Description 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏. 游戏的规则是这样的,首先给定一个数F ...
- luoguP3235 [HNOI2014]江南乐 数论分块 + 博弈论
感觉其实很水? 题目就是一个Multi SG游戏,只需要预处理出所有的\(sg\)值即可\(O(Tn)\)计算 对于计算\(sg[n]\)而言,显然我们可以枚举划分了\(x\)堆来查看后继状态 那么, ...
- P3235 [HNOI2014]江南乐
$ \color{#0066ff}{ 题目描述 }$ 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏. 游戏的 ...
- 洛谷P3235 [HNOI2014]江南乐(Multi-SG)
题目描述 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏. 游戏的规则是这样的,首先给定一个数F,然后游戏系统 ...
- bzoj 3576[Hnoi2014]江南乐 sg函数+分块预处理
3576: [Hnoi2014]江南乐 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 1929 Solved: 686[Submit][Status ...
- BZOJ 3576: [Hnoi2014]江南乐 (SG函数)
题意 有nnn堆石子,给定FFF,每次操作可以把一堆石子数不小于FFF的石子平均分配成若干堆(堆数>1>1>1). 平均分配即指分出来的石子数中最大值减最小值不超过111.不能进行操 ...
- 【BZOJ】3576: [Hnoi2014]江南乐
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3576 很显然,这是一个multi-nim游戏. 注意:1.一个点的SG值就是一个不等于它的 ...
随机推荐
- EZpop分析
首先源代码如下 <?php class Modifier { protected $var; public function append($value){ include($value); } ...
- C#基础知识---?为何物
一. 可空类型修饰符(?)引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; 是正确的,int i=null; 编译器就会报错.可空类型的出现, ...
- git 拉取代码指定分支
问题背景: 新项目还在开发阶段,没有正式对外发布,所以开发同事合并代码到develop上(或者其他名称分支上),而不是到master分支上 通过git拉取代码的时候,默认拉取的是master分支,如下 ...
- sizeof()和 strlen()的区别 --- 个人笔记
在学习C语言和linux的时候,遇到了一些常见问题.题目,有些很简单,有些容易出错,本人水平有限,未免会出错,今天有时间,就将以前做的笔记,一一拿出来,写写blog. sizeof()和 strlen ...
- CrackMe-Cycle
转载自 OllyDBG入门教程 PS:自己逆在 最后的时候总会崩,不知道为什么. 我们输入用户名 CCDebuger,序列号 78787878,点上面那个"Check"按钮,呵 ...
- 输入URL后浏览器的过程
In this article, I want my readers to get a picture of a very basic concept of the web world. Previo ...
- 解析ThreadPoolExecutor类是如何保证线程池正确运行的
摘要:对于线程池的核心类ThreadPoolExecutor来说,有哪些重要的属性和内部类为线程池的正确运行提供重要的保障呢? 本文分享自华为云社区<[高并发]通过源码深度解析ThreadPoo ...
- Learning ROS: Roslaunch tips for large projects
Design tip: Top-level launch files should be short, and consist of include's to other files correspo ...
- Oracle存储过程锁表
存储过程: 解决方法如下: 1:查V$DB_OBJECT_CACHE SELECT * FROM V$DB_OBJECT_CACHE WHERE name='CRM_LASTCHGINFO_DAY' ...
- Sublime Text 快速分别独立选中多行
效果图 直接上代码 import sublime, sublime_plugin # 独立选择每一行(在当前选中范围内) class SelectEverySingleLine(sublime_plu ...