正题

题目链接: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函数】的更多相关文章

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

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

  2. luogu P3235 [HNOI2014]江南乐

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

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

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

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

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

  5. P3235 [HNOI2014]江南乐

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

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

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

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

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

  8. BZOJ 3576: [Hnoi2014]江南乐 (SG函数)

    题意 有nnn堆石子,给定FFF,每次操作可以把一堆石子数不小于FFF的石子平均分配成若干堆(堆数>1>1>1). 平均分配即指分出来的石子数中最大值减最小值不超过111.不能进行操 ...

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

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

随机推荐

  1. linux中 ~ 表示的是什么目录?

    ~ 表示代码主目录,也就是当前登录用户的用户目录.比如:我登录用户是chencd ~~ 代表的就是 /home/chen/当然前提是有用户目录,如果没有/home/chen目录的话情况就比较多了.总之 ...

  2. C#设计模式---单例模式(Singleton Pattern)

    一.定义 从"单例"字面意思上理解为一个类只有一个实例.官方定义:确保一个类只有一个实例,并提供一个全局访问点. 二.实现 下面以实现一个日志记录类为例,描述单例模式. 1 usi ...

  3. css - 行高

    css - 行高 line-height行高 取值:px | em | rem | 百分比 | 纯数字 | normal | inherit 设置给:块.行内.行内块 应用给:文本 继承:块.行内.被 ...

  4. Java程序设计学习笔记(二)

    --正则表达式    正则表达式         ^ 匹配的开始         $ 匹配的结束         [] 表示匹配任意一个字符             [asdasd]          ...

  5. MongoDB查询或修改内嵌文档

    作为非关系型数据库中的佼佼者,MongoDB一大优势在于能够在一条文档中存储对象类型的数据,适当增加冗余来让数据库更好用.文档中一个对象类型的字段在MongoDB中被称为内嵌文档(Embedded) ...

  6. Consul 入门-运行

    HashiCorp Consul 是由 HashiCorp 公司开发的,它是一家专注于 DevOps 工具链的公司,旗下的明星级产品包括 Vagrant.Terraform.Vault.Nomad 以 ...

  7. 你的域名是如何变成 IP 地址的?

    我的 个人网站 上线了,上面可以更好的检索历史文章,并且可以对文章进行留言,欢迎大家访问 可能大家都知道或者被问过一个问题,那就是很经典的「从浏览器输入 URL 再到页面展示,都发生了什么」.这个问题 ...

  8. 关于innodb中MVCC的一些理解

    一.MVCC简介 MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代 ...

  9. Spring源码浅析之bean实例的创建过程(二)

    在上一篇内容中,介绍了doGetBean方法的源码内容,知道了bean在创建的过程中,有三个范围,单例.多例.Scope,里面都使用到了createBean.下面本篇文章的主要内容,就是围绕creat ...

  10. 博观约取系列 ~ 探测Bert Finetune对向量空间的影响

    熟悉NLP的同学对Bert Finetune一定不陌生,基本啥任务上来都可以Bert Finetune试一把.可是模型微调一定比直接使用预训练模型效果好么?微调究竟对Bert的向量空间产生了哪些影响嘞 ...