题意

有n个格子,标号为0 ~ n-1,每个格子上有若干石子,每次操作可以选一个0 ~ n-2的格子上的一颗石子,分裂为两颗,然后任意放在后面的两个格子内,这两个格子可以相同.求使先手必胜的第一步的方案数以及最小字典序的方案.

分析

每一个石子都是独立的,所以考虑某一位上的一颗石子的SG函数,再异或起来就行了.实际上只用异或石子数为奇数的,因为偶数个石子异或两次相当于没有异或.

我们先把位置反向并从1~n标号,也就是最后边是1,最左边是n.这样就能对不同的n用同样的SG函数

那么对于位置iii,它的SG函数如下:

SG[i]=mex{ ∪i>j>=kSG[j] xor SG[k] }SG[i]=mex\{\ \cup_{i>j>=k}SG[j]\ xor\ SG[k] \ \}SG[i]=mex{ ∪i>j>=k​SG[j] xor SG[k] }

所以说直接预处理就行了

求方案的时候,注意字典序最小反序后就是字典序最大,所以要从大到小枚举

CODE

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
template<typename T>void read(T &num) {
char ch; int flg=1;
while((ch=getchar())<'0'||ch>'9')if(ch=='-')flg=-flg;
for(num=0;ch>='0'&&ch<='9';num=num*10+ch-'0',ch=getchar());
num*=flg;
}
const int MAXN = 22;
int SG[MAXN], n, A[MAXN], vis[50]; //vis要开大点,SG函数会超过n
inline void Pre() {
SG[1] = 0;
for(int i = 2; i < MAXN; ++i) {
for(int j = 1; j < i; ++j)
for(int k = j; k < i; ++k)
vis[SG[j]^SG[k]] = i;
for(SG[i] = 0; vis[SG[i]] == i; ++SG[i]);
}
}
inline void solve(int ans) {
int res = 0, ans1 = -1, ans2, ans3;
for(int i = n; i > 1; --i)
for(int j = i-1; j > 0; --j)
for(int k = j; k > 0; --k)
if((ans^SG[i]^SG[j]^SG[k]) == 0) {
++res;
if(!(~ans1))
ans1 = n-i, ans2 = n-j, ans3 = n-k;
}
printf("%d %d %d\n%d\n", ans1, ans2, ans3, res);
}
int main() {
int T; read(T); Pre();
while(T--) {
read(n);
int ans = 0;
for(int i = n; i > 0; --i) {
read(A[i]);
if(A[i]&1) ans ^= SG[i];
}
if(!ans) printf("-1 -1 -1\n0\n");
else solve(ans);
}
}

BZOJ 1188 / Luogu P3185 [HNOI2007]分裂游戏 (SG函数)的更多相关文章

  1. bzoj 1188 [HNOI2007]分裂游戏 SG函数 SG定理

    [HNOI2007]分裂游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1394  Solved: 847[Submit][Status][Dis ...

  2. BZOJ1188 [HNOI2007]分裂游戏(SG函数)

    传送门 拿到这道题就知道是典型的博弈论,但是却不知道怎么设计它的SG函数.看了解析一类组合游戏这篇论文之后才知道这道题应该怎么做. 这道题需要奇特的模型转换.即把每一个石子当做一堆石子,且原来在第i堆 ...

  3. bzoj 1188 : [HNOI2007]分裂游戏 sg函数

    题目链接 给n个位置, 每个位置有一个小球. 现在两个人进行操作, 每次操作可以选择一个位置i, 拿走一个小球.然后在位置j, k(i<j<=k)处放置一个小球. 问你先进行什么操作会先手 ...

  4. BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)

    Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 871  Solved: 365[Submit][Status][Discuss] Description ...

  5. BZOJ 1188 分裂游戏(sg函数)

    如果把每堆巧克力看做一个子游戏,那么子游戏会互相影响. 如果把全部堆看做一个子游戏,那么状态又太多. 如果把每一个单独的巧克力看成一个子游戏的话,那么状态很少又不会互相影响. 令sg[i]表示一个巧克 ...

  6. P3185 [HNOI2007]分裂游戏

    $ \color{#0066ff}{ 题目描述 }$ 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i ...

  7. [HNOI2007]分裂游戏 SG打表博弈

    结论:其实每一个巧克力都是一堆石子 它的石子数就是它到队尾的距离 打一个SG表即可 #include<bits/stdc++.h> using namespace std; typedef ...

  8. bzoj 1188 [HNOI2007]分裂游戏(SG函数,博弈)

    1188: [HNOI2007]分裂游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 733  Solved: 451[Submit][Status ...

  9. bzoj1188 [HNOI2007]分裂游戏 博弈论 sg函数的应用

    1188: [HNOI2007]分裂游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 973  Solved: 599[Submit][Status ...

随机推荐

  1. SQLite进阶-15.触发器

    目录 触发器(Trigger) 触发器(Trigger)的要点: 触发器应用 查看触发器 删除触发器 触发器(Trigger) 触发器(Trigger)是数据库的回调函数,它会在指定的数据库事件发生时 ...

  2. jquery【点击】导航按钮的来回切换

    先获取元素的属性值,根据属性值进行判断,点击时对属性进行设置 <i class="layui-icon layui-icon-shrink-right" id="n ...

  3. 第十三章 ZYNQ-MIZ702 PL中断请求

    本篇文章主要介绍外设(PL)产生的中断请求,在PS端进行处理. 在PL端通过按键产生中断,PS接受到之后点亮相应的LED. 本文所使用的开发板是Miz702 PC 开发环境版本:Vivado 2015 ...

  4. Disruptor 并发框架

    什么是Disruptor Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易.这个系统是建立在JVM平 ...

  5. System.Data.EntityException: The underlying provider failed on Open.

    场景:IIS默认站点建立程序,使用Windows集成身份验证方式,连接SQLServer数据库也是采用集成身份验证.我报“System.Data.EntityException: The underl ...

  6. css3之媒体查询

    <html> <head> <meta charset="utf-8"> <style> body{ background-colo ...

  7. 使用display:table实现两列自适应布局

    在张鑫旭大神那边看到的方法,我自己写了一遍,稍微添加了一些自己的风格特色. IE6/7不支持这个属性,从IE8开始支持这个属性,对于IE6/7可以用display:inline-block解决. ta ...

  8. js 中, set 与 数组 相互转换

    主要用 Array.from 方法 1.array --> set (数组转set) let array = [1, 2, 3, 4]; let set = new Set(array); 2. ...

  9. 0502 xss 实验

    0x01 dvwa xss(reflected) 1.1 Security Level: low use the typical <script>alert(1)</script&g ...

  10. 2.XML语言

    XML语言 常见应用: XML技术除用于 /*保存有关系的数据*/之外,它还经常作软件配置文件,以描述程序模块之间的关系. 在一个系统软件中,为提高系统的灵活性,它所启动的模块通常由其配置文件决定 例 ...