题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3576


很显然,这是一个multi-nim游戏。

注意:1.一个点的SG值就是一个不等于它的后继点的SG的且大于等于零的最小整数。(mex)

   2.主游戏的SG值等于所有子游戏的异或和

  

   所以区分好主游戏和后继点的区别。

     一开始多个石子堆组合起来形成了一个主游戏。

   一个石子堆可以分为多个石子堆,每一种分发构成了一个主游戏,这些主游戏的异或和构成的当前这个点(状态)的SG函数。

    显然有一个${m^{2}}$做法,即记忆化搜索SG函数。  

考虑${x/i}$只有$\sqrt{n}$种取值,再考虑一下它们的奇偶性,然后分块来做。

70Code:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<cstdlib>
 6 #include<cmath>
 7 #include<cstring>
 8 using namespace std;
 9 #define maxn 100100
10 #define llg long long
11 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
12 llg n,m,bj[maxn],sg[maxn],T,F,a[maxn];
13
14 llg dp(llg x)
15 {
16     if (bj[x]) return sg[x];
17     bj[x]=1;
18     sg[x]=0;
19     bool e[maxn];
20     memset(e,0,sizeof(e));
21     for (llg m=2;m<=x;m++)
22     {
23         llg v1=m-x%m,v2=x%m;
24         llg nsg=0;
25         if (v1&1) nsg^=dp(x/m);
26         if (v2&1) nsg^=dp(x/m+1);
27         e[nsg]=1;
28     }
29     for (llg i=0;1;i++) if (!e[i]) {sg[x]=i; return sg[x];}
30 }
31
32 int main()
33 {
34     yyj("game");
35     cin>>T>>F;
36     for (llg i=0;i<F;i++) bj[i]=1;
37     while (T--)
38     {
39         scanf("%lld",&n);
40         llg ans=0;
41         for (llg i=1;i<=n;i++)
42         {
43             scanf("%lld",&a[i]);
44             ans^=dp(a[i]);
45         }
46         if (ans) printf("1");else printf("0");
47         if (T) printf(" ");
48     }
49     return 0;
50 }

100Code:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<cstdlib>
 6 #include<cmath>
 7 #include<cstring>
 8 using namespace std;
 9 #define maxn 100100
10 #define llg int
11 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
12 llg n,m,bj[maxn],sg[maxn],T,F,a[maxn];
13
14 llg dp(llg x)
15 {
16     if (bj[x]) return sg[x];
17     bj[x]=1;
18     sg[x]=0;
19     bool e[maxn];
20     memset(e,0,sizeof(e));
21     for (llg m=2,j=0;m<=x;m=j+1)
22     {
23         j=x/(x/m);
24         llg v1=m-x%m,v2=x%m,cnt=j-m+1;
25         llg nsg=0;
26         if (v1&1) nsg^=dp(x/m);
27         if (v2&1) nsg^=dp(x/m+1);
28         e[nsg]=1;
29         if (cnt>=2)
30         {
31             nsg=0;
32             if (((m+1)-x%(m+1))&1) nsg^=dp(x/(m+1));
33                    if ((x%(m+1))&1) nsg^=dp(x/(m+1)+1);
34                    e[nsg]=1;
35         }
36     }
37     for (llg i=0;1;i++) if (!e[i]) {sg[x]=i; return sg[x];}
38 }
39
40 int main()
41 {
42     yyj("game");
43     cin>>T>>F;
44     for (llg i=0;i<F;i++) bj[i]=1;
45     while (T--)
46     {
47         scanf("%d",&n);
48         llg ans=0;
49         for (llg i=1;i<=n;i++)
50         {
51             scanf("%d",&a[i]);
52             ans^=dp(a[i]);
53         }
54         if (ans) printf("1");else printf("0");
55         if (T) printf(" ");
56     }
57     return 0;
58 }

转载于:https://www.cnblogs.com/Dragon-Light/p/6411602.html

【BZOJ】3576: [Hnoi2014]江南乐相关推荐

  1. 【bzoj3576】 Hnoi2014—江南乐

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

  2. Bzoj3576 [Hnoi2014]江南乐

    Time Limit: 30 Sec  Memory Limit: 512 MB Submit: 1555  Solved: 552 Description 小A是一个名副其实的狂热的回合制游戏玩家. ...

  3. BZOJ 3576 江南乐

    http://www.lydsy.com/JudgeOnline/problem.php?id=3576 思路:由于数字巨大,因此N^2异或做法是过不了的,我们考虑将n个石子分成i堆,那么会有n%i堆 ...

  4. BZOJ 3571: [Hnoi2014]画框

    3571: [Hnoi2014]画框 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 996  Solved: 561 [Submit][Status ...

  5. 虚树(bzoj 3572: [Hnoi2014]世界树)

    例题: 一棵n个节点的树,m次查询,每次查询给你一个点集U,对于树上的所有节点x(x∉U),你要找到一个点y(y∈U)满足y点离x点最近且标号最小,表示x点受y点管辖,而你的任务就是对于每次查询输出U ...

  6. BZOJ 3573 [HNOI2014]米特运输

    题目链接:传送门 冗长冗长的题面: 3573:[HNOI2014]米特运输3573: [HNOI2014]米特运输3573:[HNOI2014]米特运输 Description 米特是D星球上一种非常 ...

  7. bzoj 3572 [Hnoi2014]世界树——虚树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3572 关于虚树:https://www.cnblogs.com/zzqsblog/p/556 ...

  8. P3235-[HNOI2014]江南乐【整除分块,SG函数】

    正题 题目链接:https://www.luogu.com.cn/problem/P3235 题目大意 TTT组游戏,固定给出FFF.每组游戏有nnn个石头,每次操作的人可以选择一个数量不少于FFF的 ...

  9. 【BZOJ3576】江南乐,博弈

    传送门 思路: 很厉害的一道博弈 虽说是暴力求SG函数,但是要加入分块优化 如果说直接按照规则求的话是O(n2)O(n^2)的 (这也是我会的--) 但是注意到⌊ni⌋⌊\frac n i⌋这个神奇的 ...

  10. BZOJ.3575.[HNOI2014]道路堵塞(最短路 动态SPFA)

    题目链接 \(Description\) 给你一张有向图及一条\(1\)到\(n\)的最短路.对这条最短路上的每条边,求删掉这条边后\(1\)到\(n\)的最短路是多少. \(Solution\) 枚 ...

最新文章

  1. stdafx.h头文件
  2. 使用 Docker 部署 Spring Boot 项目
  3. JAVA反射使用手记
  4. C/C 代码规范注释有哪些讲究?
  5. 音频自动增益 与 静音检测 算法 附完整C代码
  6. Elasticsearch安装-源码
  7. Android ListView优化
  8. 基于Matlab高斯光束菲涅耳衍射的模拟
  9. 鼎捷易飞ERP视频教程-金速鹏-专题视频课程
  10. 设计院中心所工作流程 CAD广播电视工程工艺绘图
  11. 如何搭建远程访问服务器?外网访问数据库实操教程
  12. 深度学习图像分类数据集制作
  13. Spring Security完成安全认证
  14. linux a卡怎么切换n卡,手把手教您win10系统a卡切换独显的具体办法
  15. Zookeeper 3.5.7学习记录(一)——集群的坑
  16. Guessing the Greatest (hard version)-(交互+二分+思维)
  17. 打开计算机网络自动连接怎么回事,win10系统电脑连接宽带后会自动打开Bing网页怎么办...
  18. rtk服务器协议,南方rtk服务器地址和端口
  19. 大内存PDF文件转Word免费之道
  20. Linux的LVM磁盘卷轴深度学习

热门文章

  1. macOS和iOS间的隔空接力功能
  2. 在SketchUp草图大师中创建第一个3D模型
  3. dubbo学习笔记一(服务注册)
  4. JS之——设置cookie 删除cookie
  5. 服务网与Kubernetes上的Istio分5步
  6. django为Form生成的label标签添加class
  7. C语言二维数组作为函数的参数
  8. 手把手教你写电商爬虫-第四课 淘宝网商品爬虫自动JS渲染
  9. Map Reduce学习
  10. 手把手教您安全配置Apache服务器