今天本人因调了上篇博客的题而脑壳不适,不想颓题,因此有了这篇博客。

但是博客毕竟得讲点什么,想想有没有什么代码短的。

哦,好像有,就Agc010_D Decrementing好了。

Alice和Bob又在玩游戏了,这次他们有$N$个数。

每次操作为:
1.在所有不小于$2$的数中挑一个减去$1$。
2.所有数除$d$,$d$为所有数的最大公约数。
不能操作者输,如果先手必胜则输入$First$,否则输出$Second$。

其中$N\leq 10^5$,每个数$\leq 10^9$。

乍一看令人十分懵逼,但是我们很容易的发现有几个显然测结论:

1、当最小的数是1时,胜负至于所有数之和$-N$的奇偶性有关

2、有效的除$d$操作不超过$log_210^9=30$次。

我们先定义奇偶性优势:按照每一步操作恰好改变一次奇偶性,最终能获取胜利(即自己操作时有奇数个偶数)。

奇偶性劣势则反之。

然后进一步思考,对于当前操作的人:

若当前的和奇偶性状况对自己有利,则尽量这一奇偶性不改变。我们显然能找到奇数个偶数,对任意一个进行操作之后,$d$一定是个奇数,因此除$d$操作对奇偶性没有影响,并且原先的偶数不会变成奇数,并且会新产生一个奇数。由于任意操作完的局面不可能全是偶数(保证$gcd=1$),因此后手操作的人一定面对至少$2$个奇数,而奇数的数量只会一直增加,因而无论怎么操作$d$均为奇数都无法改变奇偶性劣势,因此必胜。

若当前自己处在奇偶性劣势,则必须考虑通过除$d$操作改变奇偶性。我们发现,这一操作能够实现仅当所有剩余的数中有且仅有一个奇数,且这一奇数大于$1$时才有可能。我们不得不对这个数进行操作,因此会先把原来的奇数减去$1$,使得所有数都为偶数,再新产生至少$1$个奇数。这时我们并不能确定获胜情况,因此我们需要递归地进入下一层。

由于结论$2$,最多会出现$30$层,每层只需要扫一遍,因此最终复杂度是$O(n\space log A_i)$。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define M 100050
using namespace std;
LL read(){
LL nm=0,fh=1; char cw=getchar();
for(;!isdigit(cw);cw=getchar()) if(cw=='-') fh=-fh;
for(;isdigit(cw);cw=getchar()) nm=nm*10+(cw-'0');
return nm*fh;
}
LL gcd(LL x,LL y){return y==0?x:gcd(y,x%y);}
LL n,p[M],G[M],F[M],sq[31];
void win(LL x){puts(x?"Second":"First");exit(0);}
void solve(LL now){
LL pos=0,sum=0,m=0,tot=0;
for(LL i=1;i<=n;i++) sum+=p[i],m+=(p[i]&1),pos+=(p[i]&1)*i;
if((sum&1)^(n&1)) win(now);
else if((m==1&&p[pos]==1)||m>1) win(now^1);
for(LL i=1;i<=n;i++) tot=gcd(tot,p[i]-(p[i]&1));
for(LL i=1;i<=n;i++) p[i]=(p[i]-(p[i]&1))/tot;
solve(now^1);
}
int main(){
n=read(),sq[0]=1;
for(LL i=1;i<31;i++) sq[i]=sq[i-1]*2ll;
for(LL i=1;i<=n;i++) p[i]=read();
sort(p+1,p+n+1),solve(0);
return 0;
}

  

Agc010_D Decrementing的更多相关文章

  1. AGC010 - D: Decrementing

    原题链接 题意简述 给出一个个数的序列,足够聪明的AB两人轮流进行以下操作: 令一个大于1的数减1,然后所有数除以. 如果一个人不能操作了,那么他就输了. 输入保证所有数都是正整数并且. 分析 这是一 ...

  2. [AtCoderContest010D]Decrementing

    [AtCoderContest010D]Decrementing 试题描述 There are \(N\) integers written on a blackboard. The \(i\)-th ...

  3. AGC 010D.Decrementing(博弈)

    题目链接 \(Description\) 给定\(n\)个数\(A_i\),且这\(n\)个数的\(GCD\)为\(1\).两个人轮流进行如下操作: 选择一个\(>1\)的数使它\(-1\). ...

  4. 【AGC010D】Decrementing

    Solution 日常博弈论做不出来. 首先,数值全部为1的局面先手必败. 在接下来的过程中,我们只关注那些大于1的数值. 按照官方题解的思路,首先想一个简化版的问题:没有除的操作,其余相同.那么局面 ...

  5. AtCoder Grand Contest 010 D - Decrementing

    题目描述 有n个整数,其中第i个数为Ai.这些数字的gcd为1.两人轮流操作,每次操作把一个大于1的数减1,并把所有数除以所有数的最大公约数,最后无法操作者输,求是否先手必胜. 如果当前的sum为偶数 ...

  6. AT2305-[AGC010D]Decrementing【博弈论】

    正题 题目链接:https://www.luogu.com.cn/problem/AT2305 题目大意 \(n\)个数字两个人进行博弈,每个人的操作为 选择一个大于1的数字减一 之后所有数字除以所有 ...

  7. ExtJS 4.2 Date组件扩展:添加清除按钮

    ExtJS中除了提供丰富的组件外,我们还可以扩展他的组件. 在这里,我们将在Date日期组件上添加一个[清除]按钮,用于此组件已选中值的清除. 目录 1. Date组件介绍 2. 主要代码说明 3. ...

  8. [LeetCode] Minimum Moves to Equal Array Elements II 最少移动次数使数组元素相等之二

    Given a non-empty integer array, find the minimum number of moves required to make all array element ...

  9. How to step through your code in chrome

    By executing code one line or one function at a time, you can observe changes in the data and in the ...

随机推荐

  1. web 网页截取图片

    关于在UIwebview上添加滚动图片 两种滚动手势会混淆,应为webview有webview.scrollview的属性 故参照昨天的随笔 scrollview嵌套解决方案. 本篇随笔主要讲循环使用 ...

  2. vue Element UI 导航高亮

    1. activeIndex 为默认高亮值,根据改变activeIndex的值来改变高亮的值 当页面改变的时候获取当前的路由地址,截取第一个 / 后面的值,就是当前的高亮值了 为什么要截取呢? 因为点 ...

  3. [Errno 14] PYCURL ERROR 7 - "couldn't connect to host"

    该问题就是防火墙的问题.关闭即可. /etc/init.d/iptables stop

  4. struts2 封装获取表单数据的方式

    一.属性封装 1.在action中设置成员变量,变量名与表单中的name属性值相同 2.生成变量的set方法 实例 获取用户输入的用户名和密码 jsp页面 java代码 二.模型驱动(常用) 1.ac ...

  5. go语言之并发编程 channel(1)

    单向channel: 单向通道可分为发送通道和接收通道.但是无论哪一种单向通道,都不应该出现在变量的声明中,假如初始化了这样一个变量 var uselessChan chan <- int =m ...

  6. python网络爬虫之scrapy 调试以及爬取网页

    Shell调试: 进入项目所在目录,scrapy shell “网址” 如下例中的: scrapy shell http://www.w3school.com.cn/xml/xml_syntax.as ...

  7. Tensorflow官方文档中文版——第一章

    第一示例: import tensorflow as tf import numpy as np x_data=np.float32(np.random.rand(,))#随机输入 y_data=np ...

  8. (转)linux访问windows共享文件夹的两种方法

    有时需要在linux下访问window的共享文件,可以使用mount挂载或使用samba连接. 1,mount挂载 $ mkdir windows 将共享文件夹挂载到windows文件夹: mount ...

  9. Linux expect介绍和用法

    expect时用与提供自动交互的工具.比如如果想要用ssh登陆服务器,每次都输入密码你觉得麻烦,那你就可以使用expect来做自动交互,这样的话就不用每次都输入密码了. 先看例子: #!/usr/bi ...

  10. curl使用说明

    默认curl使用get请求,可以使用-d方式指定使用post方式传递数据 https://www.cnblogs.com/gbyukg/p/3326825.html