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值就是一个不等于它的 ...
随机推荐
- COM笔记-引用计数
参考网站:https://www.cnblogs.com/fangyukuan/archive/2010/06/06/1752621.html com组件将维护一个称作是引用计数的数值.当客户从组件取 ...
- 【spring 注解驱动开发】spring ioc 原理
尚学堂spring 注解驱动开发学习笔记之 - Spring容器创建 Spring容器创建 1.Spring容器创建-BeanFactory预准备 2.Spring容器创建-执行BeanFactory ...
- Spark Ignite踩坑记录
Ignite spark 踩坑记录 简述 ignite访问数据有两种模式: Thin Jdbc模式: Jdbc 模式和Ignite client模式: shell客户端输出问题,不能输出全列: 针对上 ...
- Vue初体验(一)
每个 Vue 应用都需要通过实例化 Vue 来实现. 语法格式如下: var vm = new Vue({ // 选项 }) 接下来让我们通过实例来看下 Vue 构造器中需要哪些内容: 可以看到在 V ...
- 挂载redhat镜像创建本地yum源
上传镜像文件到/mnt文件夹下,或者上传到其他文件夹下 挂载镜像路径/mnt/cdrom 在mnt文件夹下创建cdrom文件夹 创建命令:mkdir cdrom 挂载镜像命令:mount rhel- ...
- BUUCTF-[CISCN2019 华东南赛区]Web4
BUUCTF-[CISCN2019 华东南赛区]Web4 看题 点击Read somethings,会跳转到 http://3fd8b1f9-614f-47ff-8e79-0f678e7bb4eb.n ...
- Git使用教程五
基于ssh协议(推荐) 该方式与前面https方式相比,只是影响github对于用户的身份鉴权方式,对于git的具体操作(如提交本地.添加注释.提交远程等操作)没有任何影响. 生成公私钥对指令(需 ...
- Mac 安装 Android commandlinetools 各种报错的问题
https://developer.android.com/studio/releases/platform-tools commandlinetools-mac 下载地址 解压后直接运行 sdkma ...
- 最长回文子序列---DP
问题描述 给定一个字符串s,找到其中最长的回文子序列.可以假设s的最大长度为1000. 解题思路 1.说明 首先要弄清楚回文子串和回文子序列的区别,如果一个字符串是"bbbab", ...
- WEB漏洞——RCE
RCE(remote command/code execute)远程命令/代码执行漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统. RCE漏洞 应用程序有时需要调用一 ...