Solution

  

  日常博弈论做不出来。

  

  首先,数值全部为1的局面先手必败。

  

  在接下来的过程中,我们只关注那些大于1的数值。

  

  按照官方题解的思路,首先想一个简化版的问题:没有除的操作,其余相同。那么局面结果显然和所有值的和的奇偶性有关。

  

  回到原问题。我们发现,当局面中有2个或更多奇数,其余为偶数时,我们对任意一个元素进行一次完整操作,仅仅会将一个元素从奇变偶,或从偶变奇。原因?只要有奇数存在,所有数的GCD必定是奇数。所以当全局除以GCD时,奇数还是奇数,偶数还是偶数,因为它们的2没有被除去。不论操作的是偶数还是奇数,都必定会留下至少一个奇数存在。因此变动也就只发生在操作的数上。暂且称之为A性质。

  

  如果先手手上全是奇数,那么必败。全1时显然必败。根据A,先手对任意数进行操作,将会出现一个偶数,那么后手可以把这个偶数变回奇数。如此反复,必定先手败。

  

  根据题目给的性质:初始时GCD为1。这意味着初始局面必定有1个或以上的奇数。

  

  接下来,对局面按偶数的个数分类:

  

  (1)有奇数个偶数:必胜。证明:先手先操作一个偶数,那么此时局面中有2+个奇数,以及偶数个偶数,符合A,则变化只发生在操作数上。如果后手操作一个偶数变奇数,那么先手再操作一个奇数变偶数;如果后手操作一个奇数变成偶数,那么先手可以再操作这个数变成奇数(既然后手能操作,那么操作前数肯定\(\ge 3\))。如此进行,某个时刻后手操作前将会有没有偶数,即全为奇数。我们已经证明此时先手必败。

  

  (2)有偶数个偶数:如果没有奇数,先手任意操作时,-1后出现一个奇数,大概理解为满足A,则都会使得后手有(1)的局面,即先手必败。如果有2+个奇数,此时满足A,先手任做一次操作,都会使后手有(1),先手必败。如果恰好有1个奇数,这时候我们无法推理什么,但是此时我们发现,如果先手操作某一个偶数,那么就直接输了,所以先手只有1种选择:操作那个奇数。于是问题就变成模拟了。我们递归处理,直到遇到上述情况位置。由于每次GCD至少是2,于是层数就是\(\mathcal O(\log)\)的。

  

  

  

  在这稍微总结一下:博弈论题一般是要发现一些逼迫方法,并从这些角度来考虑必胜策略。

  

  

  

Code

#include <cstdio>
#include <iostream>
using namespace std;
namespace IO{/*{{{*/
const int S=10000000;
char buf[S];
int pos;
void load(){
fread(buf,1,S,stdin);
pos=0;
}
char getChar(){
return buf[pos++];
}
int getInt(){
int x=0,f=1;
char c=getChar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getChar();}
while('0'<=c&&c<='9'){x=x*10+c-'0';c=getChar();}
return x*f;
}
}/*}}}*/
using IO::getInt;
const int N=100005;
int n;
int a[N];
void readData(){
n=getInt();
for(int i=1;i<=n;i++)
a[i]=getInt();
}
int gcd(int x,int y){
if(x<y) swap(x,y);
for(int z=x%y;z;x=y,y=z,z=x%y);
return y;
}
void simulate(int who){
static int sum[2],oddpos;
bool all1flag=true;
sum[0]=sum[1]=0;
for(int i=1;i<=n;i++)
if(a[i]!=1){
all1flag=false;
sum[a[i]&1]++;
if(a[i]&1)
oddpos=i;
}
if(all1flag)
throw who^1;
if(sum[0]&1)
throw who;
if(sum[1]>1)
throw who^1;
if(sum[1]==0)
throw who^1;
a[oddpos]--;
int g=-1;
for(int i=1;i<=n;i++)
if(a[i]!=1){
if(g==-1)
g=a[i];
else
g=gcd(g,a[i]);
}
for(int i=1;i<=n;i++)
if(a[i]!=1)
a[i]/=g;
simulate(who^1);
}
int main(){
IO::load();
readData();
try{
simulate(1);
}
catch(int e){
puts(e?"First":"Second");
}
return 0;
}

【AGC010D】Decrementing的更多相关文章

  1. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  2. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  3. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  4. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  5. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  6. Python高手之路【三】python基础之函数

    基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...

  7. Python高手之路【一】初识python

    Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...

  8. 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】

    说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...

  9. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

随机推荐

  1. ionic访问odoo 11接口

    在架设完毕odoo 11的网站之后,第一次面临手机app该如何访问后台网站的问题,是不是模式类似asp.net mvc 那样的模式,或者还存在其他的访问方法,带着这个疑问与困惑,开始的我的研究学习之路 ...

  2. 关于小程序登录时获取openId和unionId走过的坑

    目前的项目是在做小程序这方面的,接触过的人应该都知道,同一个微信开放平台下的相同主体的App.公众号.小程序的unionid是相同的,这样就可以锁定是不是同一个用户.微信针对不同的用户在不同的应用下都 ...

  3. RabbitMQ 发布订阅-实现延时重试队列(参考)

    RabbitMQ消息处理失败,我们会让失败消息进入重试队列等待执行,因为在重试队列距离真正执行还需要定义的时间间隔,因此,我们可以将重试队列设置成延时处理.今天参考网上其他人的实现,简单梳理下消息延时 ...

  4. C语言----数据类型(基础篇一)

    C语言的入门程序模板 #include <stdio.h> /*使用或者包含系统里面的程序*/ main() /*程序入口点*/ { /*起点*/ +; /*叫计算机执行的指令*/ } / ...

  5. nginx的access.log文件详解

    事实证明,日志文件真的是很重要很重要的.能够帮助我们快速的定位问题,并且知道用户访问的状态,浏览器,Ip,接口地址等,简直可怕.. 一.nginx的access.log(1)对博主而言,日志文件存放在 ...

  6. 2016.3.30 OneZero站立会议

    会议时间:2016年3月30日  13:00~13:20 会议成员:冉华,张敏,王巍,夏一鸣. 会议目的:汇报前一天工作,全体成员评论,确定会议内容或分配下一步任务. 会议内容: 1.汇报头一天工作情 ...

  7. 个人博客作业Week7(阅读文章,心得体会)

    Alpha阶段结束了,内心可以说是五味杂陈.不是说我们的产品拿不上台面那般差劲,复杂的心绪主要来源于和别的队的比较,别的队才刚刚发布没多久访问量和注册量就破百了,并且还发起了找bug送红包的活动.可能 ...

  8. 微信开发-charles抓包

    在微信开发过程中有一块不能使用开发者工具进行调试,需要查看请求的返回,故使用了charles抓包工具. 环境配置 1.http://www.charlesproxy.com/getssl/ 下载cha ...

  9. 结对项目junit测试用例

    题目:我们假设我们要写一个整数除法的类,并且给他写测试用例. 结对分工:滕娟负责写代码,搜集资料,整理,潘广玫负责进行测试,处理测试结果 github地址链接: https://github.com/ ...

  10. Python学习笔记——Python Number(数字)

    Python Number 类型转换 int(x, y) #将x转换为一个整数,y为进制数.如 int('11',2)将二进制数的11转成十进制数的整数,结果为3 long(x, y) #将x转换为一 ...