【BZOJ3576】江南乐(博弈论)

题面

BZOJ

洛谷

题解

无论一堆石头怎么拆分,都并不能改变它是一个\(Multi-SG\)的事实。

既然每一组的\(F\)都是固定的,那么我们预处理所有的可能的堆,而将石子拆分成若干堆,也只需要考虑\(SG\)函数的值就好了。

但是这样子求\(SG\)值的复杂度是\(O(V^2)\)的,其中\(V\)是值域,也就是\(10^5\)。

再分析一下,将\(x\)个式子拆分成的最少的石子个数是\([x/m]\),最多的情况是\([x/m+1]\),

因为\([x/m]\)可以数论分块,而对于\(SG\)函数值的影响之和奇偶性相关,所以只需要考虑\([x/m],[x/m+1]\)出现次数的奇偶性一共\(4\)中情况考虑。

\([x/m]\)个数的奇偶性只和\(m\)相关,\([x/m+1]\)个数的奇偶性只和\(x\%m\)相关,而\(x\%m=x-m[x/m]\)。

而\([x/m]\)在数论分块中是定值,不需要额外考虑,那么只需要考虑\(m\)的奇偶性就好啦。

然而预处理的话复杂度比较爆炸,毕竟我们不一定所有的值都会被用到,那么就写一个记忆化搜索。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAX 100100
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int SG[MAX],vis[MAX];
int getSG(int x)
{
if(~SG[x])return SG[x];
for(int i=2,k;i<=x;i=k+1)
{
k=x/(x/i);
for(int j=i;j<=min(i+1,k);++j)
{
int s=0;
if((x%j)&1)s^=getSG(x/j+1);
if((j-x%j)&1)s^=getSG(x/j);
vis[s]=x;
}
}
for(int i=0;;++i)if(vis[i]!=x)return SG[x]=i;
}
int main()
{
int T=read(),F=read();
memset(SG,-1,sizeof(SG));
for(int i=0;i<F;++i)SG[i]=0;
while(T--)
{
int n=read(),s=0;
while(n--)s^=getSG(read());
printf("%d ",(bool)s);
}
return 0;
}

【BZOJ3576】江南乐(博弈论)的更多相关文章

  1. BZOJ-3576 江南乐 博弈+优化

    fye测试原题,高一全跪,高二学长除了CA爷似乎都A辣(逃) 3576: [Hnoi2014]江南乐 Time Limit: 30 Sec Memory Limit: 512 MB Submit: 1 ...

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

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

  3. [HNOI2014]江南乐 博弈论

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

  4. [BZOJ3576]江南乐

    挺好的题 我们算出每个数的sg值后异或起来即可 对于$n$,我们要求$sg_n$ 朴素的想法是枚举把$n$个石子分成$m$堆,有$m-n\%m$堆大小为$\left\lfloor\frac nm\ri ...

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

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

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

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

  7. 【LOJ】#2210. 「HNOI2014」江南乐

    LOJ#2210. 「HNOI2014」江南乐 感觉是要推sg函数 发现\(\lfloor \frac{N}{i}\rfloor\)只有\(O(\sqrt{N})\)种取值 考虑把这些取值都拿出来,能 ...

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

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

  9. 【bzoj3576】 Hnoi2014—江南乐

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

随机推荐

  1. scrapy之多环境的选择使用

    scrapy之多环境的选择使用 个人主机主机上可能存在多个python环境,当在终端中使用scrapy时,容易产生错误,无法使用到自己想使用的那个python,如何解决这个问题呢? 出现这类问题时,直 ...

  2. RestTemplete

    RestTemplete是由spring提供的,可以用来模拟浏览器进行服务调用的封装好的Api,和Apache 的HttpClient功能相同,在分布式系统中可以用来服务之间的调用. 开发步骤: 1. ...

  3. No enclosing instance of type is accessible. Must qualify the allocation with an enclosing instance of type LeadRestControllerTest (e.g. x.new A() where x is an instance of ).

    java - No enclosing instance is accessible. Must qualify the allocation with an enclosing instance o ...

  4. rem移动端适配方案

    一. rem vs em 单位 定义 特点 rem font size of the root element 以根元素字体大小为基准 em font size of the element 以父元素 ...

  5. Thread类相关方法

    线程对象 每一个线程都是和类Thread的实例相关联的.在Java中,有两种基本的使用Thread对象的方式,可用来创建并发性程序.  1.在应用程序需要发起异步任务的时候,只要生成一个Thread对 ...

  6. mysql_linux(centos7 mysql 5.7.19)

    centos7  mysql 5.7.19安装 1.解压文件 [root@centos3 ~]# tar -zxvf mysql-5.7.19-linux-glibc2.12-x86_64.tar.g ...

  7. Oracle条件判断if...elsif

  8. day 7-5 生产者消费者模型

    一. 生产者和消费者模型 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度. 二. 为什么要使用生产者和消费者模式 ...

  9. python爬虫scrapy的LinkExtractor

    使用背景: 我们通常在爬去某个网站的时候都是爬去每个标签下的某些内容,往往一个网站的主页后面会包含很多物品或者信息的详细的内容,我们只提取某个大标签下的某些内容的话,会显的效率较低,大部分网站的都是按 ...

  10. MySQL 单个表锁死 对查询语句无响应

    这个时候应该怀疑读取都被加锁,应该尝试使用 show processlist 查看每一个正在运行的进程. 可以看到这样一个列表,里面有使用者即用户,正在使用数据库的 host, 使用的 db 目前的 ...