[BZOJ3576]江南乐
挺好的题
我们算出每个数的sg值后异或起来即可
对于$n$,我们要求$sg_n$
朴素的想法是枚举把$n$个石子分成$m$堆,有$m-n\%m$堆大小为$\left\lfloor\frac nm\right\rfloor$的石子,有$n\%m$堆大小为$\left\lfloor\frac nm\right\rfloor+1$的石子,因为是异或所以只有奇数堆的石子对$sg_n$有贡献,直接算出来再求mex即可
考虑优化,暴力是枚举$2\leq m\leq n$,因为当$\left\lfloor\frac nm\right\rfloor$相同时奇偶性相同的$m$算出来的答案是一样的,所以我们只需枚举所有使得$\left\lfloor\frac nm\right\rfloor$不同的$m$,用$m$和$m+1$更新答案即可
用记忆化搜索记录答案即可,时间复杂度可能是$O\left(a\sqrt a\right)$,其中$a$是数字的大小
#include<stdio.h>
#include<string.h>
int f[100010],v[1000010],M,F;
void get(int n){
if(~f[n])return;
if(n<F){
f[n]=0;
return;
}
int i,nex,s;
for(i=2;i<=n;i=nex+1){
nex=n/(n/i);
if(f[n/i]==-1)get(n/i);
if(n!=2&&f[n/i+1]==-1)get(n/i+1);
}
M++;
for(i=2;i<=n;i=nex+1){
nex=n/(n/i);
s=0;
if(n%i&1)s^=f[n/i+1];
if((i-n%i)&1)s^=f[n/i];
v[s]=M;
if(i<nex){
s=0;
if(n%(i+1)&1)s^=f[n/i+1];
if((i+1-n%(i+1))&1)s^=f[n/i];
v[s]=M;
}
}
for(i=0;v[i]==M;i++);
f[n]=i;
}
int main(){
int T,n,x,s;
scanf("%d%d",&T,&F);
memset(f,-1,sizeof(f));
while(T--){
scanf("%d",&n);
s=0;
while(n--){
scanf("%d",&x);
get(x);
s^=f[x];
}
putchar(s?'1':'0');
putchar(' ');
}
}
[BZOJ3576]江南乐的更多相关文章
- BZOJ-3576 江南乐 博弈+优化
fye测试原题,高一全跪,高二学长除了CA爷似乎都A辣(逃) 3576: [Hnoi2014]江南乐 Time Limit: 30 Sec Memory Limit: 512 MB Submit: 1 ...
- 【BZOJ3576】江南乐(博弈论)
[BZOJ3576]江南乐(博弈论) 题面 BZOJ 洛谷 题解 无论一堆石头怎么拆分,都并不能改变它是一个\(Multi-SG\)的事实. 既然每一组的\(F\)都是固定的,那么我们预处理所有的可能 ...
- bzoj 3576[Hnoi2014]江南乐 sg函数+分块预处理
3576: [Hnoi2014]江南乐 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 1929 Solved: 686[Submit][Status ...
- 洛谷 P3235 [HNOI2014]江南乐 解题报告
P3235 [HNOI2014]江南乐 Description 两人进行 T 轮游戏,给定参数 F ,每轮给出 N 堆石子,先手和后手轮流选择石子数大于等于 F 的一堆,将其分成任意(大于1)堆,使得 ...
- 【LOJ】#2210. 「HNOI2014」江南乐
LOJ#2210. 「HNOI2014」江南乐 感觉是要推sg函数 发现\(\lfloor \frac{N}{i}\rfloor\)只有\(O(\sqrt{N})\)种取值 考虑把这些取值都拿出来,能 ...
- 【bzoj3576】 Hnoi2014—江南乐
http://www.lydsy.com/JudgeOnline/problem.php?id=3576 (题目链接) 题意 给出一个数$F$,然后$n$堆石子,每次操作可以把一堆不少于$F$的石子分 ...
- bzoj3576: [Hnoi2014]江南乐
Description 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏. 游戏的规则是这样的,首先给定一 ...
- 【bzoj3576】[Hnoi2014]江南乐 博弈论+SG定理+数学
题目描述 两人进行 $T$ 轮游戏,给定参数 $F$ ,每轮给出 $N$ 堆石子,先手和后手轮流选择石子数大于等于 $F$ 的一堆,将其分成任意(大于1)堆,使得这些堆中石子数最多的和最少的相差不超过 ...
- 【bzoj3576】[Hnoi2014]江南乐 数论分块+博弈论
Description 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏. 游戏的规则是这样的,首先给定一个数F ...
随机推荐
- python3中字典的遍历和合并
#字典的遍历方式 dic={"a":1,"b":2,"c":3} for k in dic: print (k,dic[k]) for k, ...
- webpack自动生成项目的html
1 自动生成多个html页面 设置webpack.config.js中的plugins属性,多次调用plugin插件(new htmlWebpackPlugin()),同时设置对应数量的.js入口文件 ...
- python基础===继承和多继承
继承 class A: def spam(self): print("A.SPAM") def add(self, x,y): return x+y class B(A): def ...
- python基础=== itertools介绍(转载)
原文链接:http://python.jobbole.com/85321/ Python提供了一个非常棒的模块用于创建自定义的迭代器,这个模块就是 itertools.itertools 提供的工具相 ...
- sleep() 函数
函数名: sleep 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned seconds); 头文件 #include <windows.h> # wi ...
- f1 f12热键关闭
fn+f2进入bios系统——>找到configuration——>Hotkey Mode——>enter——>选择disable——>fn+f10保存
- python插入oracle数据
# coding=utf- ''''' Created on -- @author: ''' import json; import urllib2 import sys import cx_Orac ...
- MySQL查找出重复的记录
问题 查找表中多余的重复记录,重复记录是根据单个字段来判断的.例如:有张表中有uid和uname两个字段,现在需要查找出uname重复的所有数据列.数据表如下: id o_id uname 1 11 ...
- Python Flask 蓝图Blueprint
1. 目录结构 2. manage.py类似于django中manage import fcrm if __name__ == '__main__': fcrm.app.run(port=8001) ...
- LeetCode解题报告—— Swap Nodes in Pairs & Divide Two Integers & Next Permutation
1. Swap Nodes in Pairs Given a linked list, swap every two adjacent nodes and return its head. For e ...