[hdu7022]Jsljgame
先考虑$x=y$的情况,此时即是一个平等博弈,因此考虑$sg$函数
具体的,有$sg(n)=\begin{cases}0&(n=0)\\mex(\{sg(n-i)\mid 1\le i\le n,i\ne x\})&(n\ge 1)\end{cases}$,简单计算$sg(n)$的前几项,不难发现规律$sg(n)=\lfloor\frac{n}{2x}\rfloor x+n\ mod\ x$,进而将其异或即可
(若异或和为0则先手必败,否则先手必胜)
接下来,不妨假设$x>y$且$a_{1}\le a_{2}\le ...\le a_{n}$,此时再分类讨论:
1.若$a_{n}<y$,显然限制没有意义,仍是一个平等博弈,并且有$sg(n)=n$
2.若$a_{n}\ge y$,此时先手必胜,证明如下——
对其进行归纳($n$和$\{a_{i}\}$的字典序),并对此分类讨论:
1.若$n=1$或$a_{n-1}<y$,则总存在$(i,z)$满足$1\le i\le n$且$0\le z<a_{i}$,使得若$a_{i}=z$则$\bigoplus_{i=1}^{n}a_{i}=0$,那么再对$(i,z)$分类讨论——
a.若$1\le i<n$或$i=n$且$z\ne a_{n}-x$,那么将第$i$堆取到$z$个
b.若$i=n$且$z=a_{n}-x$,那么将第$n$堆取到$z+y$个
不论是哪一种情况,后手操作后若$a_{n}\ge y$由归纳假设先手必胜,否则必然异或和非0(第一种情况异或和初始为0且必然变化,第二种情况只能在第$n$堆中取$y$个)同样先手必胜
2.若$n\ge 2$且$a_{n-1}\ge y$,再分类讨论:
a.若$n\ge 3$或$a_{n}>y$,那么先手只需要在第$n-2$或第$n$堆中取一个,后手不可能同时使$a_{n-1},a_{n}<y$,那么由归纳假设先手必胜
b.若$n=2$且$a_{n}=y(=a_{n-1})$,那么先手只需要取完第$n-1$堆,之后后手不能取完第$n$堆,后手操作后先手再取完第$n$堆即可
类似地,对于$x<y$的情况,再分类讨论:
1.若$a_{n}<x$,同样为$sg(n)=n$的平等博弈
2.若$a_{n}\ge x$,此时先手操作后必然要使$\max_{i=1}^{n}a_{i}<x$(否则由之前的结论后手必胜),那么也即是要$n=1$或$a_{n-1}<x$,进而要保证异或和为0,即要求$S<x$且$S\ne a_{n}-x$(其中$S=\bigoplus_{i=1}^{n-1}a_{i}$)
综上,时间复杂度为$o(n\log n)$(排序),可以通过


1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1005
4 int t,n,x,y,ans,a[N];
5 int main(){
6 scanf("%d",&t);
7 while (t--){
8 scanf("%d%d%d",&n,&x,&y);
9 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
10 ans=0;
11 if (x==y){
12 for(int i=1;i<=n;i++)ans^=a[i]/(x<<1)*x+a[i]%x;
13 if (ans)printf("Jslj\n");
14 else printf("yygqPenguin\n");
15 continue;
16 }
17 sort(a+1,a+n+1);
18 if (a[n]<min(x,y)){
19 for(int i=1;i<=n;i++)ans^=a[i];
20 if (ans)printf("Jslj\n");
21 else printf("yygqPenguin\n");
22 continue;
23 }
24 if (x>y)printf("Jslj\n");
25 else{
26 if ((n==1)||(a[n-1]<x)){
27 for(int i=1;i<n;i++)ans^=a[i];
28 if ((ans<x)&&(ans!=a[n]-x))printf("Jslj\n");
29 else printf("yygqPenguin\n");
30 }
31 else printf("yygqPenguin\n");
32 }
33 }
34 return 0;
35 }
[hdu7022]Jsljgame的更多相关文章
随机推荐
- requirejs的加载原理 - 场景1. 定义一个require依赖a模块
我们学习一个新的技术,熟练的使用之后,就应该去探索它的原理.这篇文章我们来探索下requirejs的原理. 从4个场景来探索requirejs的原理 场景1. 定义一个require依赖b模块 场景2 ...
- Wireshark简单协议的抓包分析
一.实验目的 HTTP.TCP.UDP.ICMP.ARP.IP.FTP.TELNET查询分析 基本掌握查询命令的使用方法 二.实验环境 硬件环境:一台Windows7系统,一台XP系统 软件环境:VM ...
- 阿里云服务器上在docker部署jenkins
1.查询jenkins:docker search jenkins 2.拉取jenkins镜像 docker pull jenkins/jenkins:lts 3.新建jenkins的工作目录: mk ...
- 详解python三大器——迭代器、生成器、装饰器
迭代器 聊迭代器前我们要先清楚迭代的概念:通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一次迭代得到的结果作为下一次迭代的初始值). 可迭代对象(i ...
- Python实现可视化操作
# Author kevin_hou #简单的GUI文本编辑器 from tkinter import * from tkinter.scrolledtext import ScrolledText ...
- kettle使用
Kettle的安装及简单使用 目录 Kettle的安装及简单使用 一.kettle概述 二.kettle安装部署和使用 Windows下安装 案例1:MySQL to MySQL 案例2:使用作业执行 ...
- 【UE4 设计模式】工厂方法模式 Factory Method Pattern 及自定义创建资源
概述 描述 又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式,或者多态工厂(Polymorphic Factory)模式 工厂父类负责定义创建产品对象的公共接口,而工厂子类 ...
- Noip模拟33垫底反思 2021.8.8
T1 Hunter 考场上没写$%p$挂了25分.也是很牛皮,以后打完过了样例一定要检查 因为样例太小了......很容易忘记%%%% 正解随便手模就出来了. 1 #include<bits/s ...
- windows下wchar_t的问题
使用vs新建工程或者编译工程的时候默认在编译设置里面讲wchar_t设置为内置类型,如下图: 但是在编译相互依赖的工程的时候,如果有的工程不将wchar_t设置为内置类型的时候,将会出现链接错误,需要 ...
- MOSFET管驱动电路的设计
https://wenku.baidu.com/view/ae727da5caaedd3382c4d3b9.html?mark_pay_doc=2&mark_rec_page=1&ma ...