AGC 010D.Decrementing(博弈)
\(Description\)
给定\(n\)个数\(A_i\),且这\(n\)个数的\(GCD\)为\(1\)。两个人轮流进行如下操作:
- 选择一个\(>1\)的数使它\(-1\)。
- 第一步进行完后,所有数会变成它除以\(g\),其中\(g\)是\(n\)个数的\(GCD\)。
当轮到一个人操作,但所有数为\(1\)时,该人输。求先手是否必胜。
\(n\leq10^5,\ A_i\leq10^9\)。
\(Solution\)
首先能发现一些性质:
- 当有一个数变成\(1\)时,答案只和所有数的和\(-n\)的奇偶性有关。
- 对所有数除以一个奇数,任意一个数的奇偶性不变;除以一个偶数,奇偶性不确定。
- \(g\neq1\)时,除以\(g\)的操作不会进行超过\(30\)次。
考虑先手。
假设当前\(\sum(A_i-1)\)的奇偶性为奇数,即处于优势,那么他应该保持操作完(所有数除以\(g\)后)所有数的奇偶性还是偶数。
注意到当有至少一个奇数时,\(GCD\)不可能为偶数。而最初所有数的\(GCD\)为\(1\),那么至少有一个奇数。另外此时偶数有奇数个,如果任意修改一个偶数,\(g\)一定还是奇数。
考虑现在的后手。先手进行上述操作后存在至少两个奇数,所以一定不能使\(g\)变为偶数来改变局面。而先手可以保持奇数的个数一直增加,所以后手没法翻盘,必败。
如果当前\(\sum(A_i-1)\)的奇偶性为偶数,即处于劣势,那么先手要使操作后的\(g\)变为偶数才可能翻盘。
由上面的分析,如果存在\(>1\)个的奇数,先手必败。否则先手只能修改这个奇数让\(g\)变成偶数。但是现在仍不能判断胜负,继续递归下一层。
最多递归\(\log\)层,所以复杂度\(O(n\log A)\)。(似乎还有个求\(\gcd\)...)
//32ms 896KB
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
#define MAXIN 300000
//#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=1e5+5;
int n,A[N];
char IN[MAXIN],*SS=IN,*TT=IN;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
}
bool DFS(bool now)
{
int s=0,fg=0;
for(int i=1; i<=n; ++i) A[i]==1&&(fg=1), s+=A[i]&1;
if((n-s)&1) return now;
if(fg||s>1) return now^1;
for(int i=1; i<=n; ++i)
if(A[i]&1) {--A[i]; break;}
int g=A[1];
for(int i=2; i<=n; ++i) g=std::__gcd(g,A[i]);
for(int i=1; i<=n; ++i) A[i]/=g;
return DFS(now^1);
}
int main()
{
const int n=read(); ::n=n;
for(int i=1; i<=n; ++i) A[i]=read();
puts(DFS(1)?"First":"Second");
return 0;
}
AGC 010D.Decrementing(博弈)的更多相关文章
- RE:从零开始的AGC被虐(到)生活(不能自理)
RE:从零开始的AGC被虐(到)生活(不能自理) 「一直注视着你,似近似远,总是触碰不到.」 --来自风平浪静的明天 AtCoder Grand Contest 001 B: Mysterious L ...
- [AtCoderContest010D]Decrementing
[AtCoderContest010D]Decrementing 试题描述 There are \(N\) integers written on a blackboard. The \(i\)-th ...
- hdu----(1849)Rabbit and Grass(简单的尼姆博弈)
Rabbit and Grass Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 5754 Life Winner Bo 组合博弈
Life Winner Bo Problem Description Bo is a "Life Winner".He likes playing chessboard gam ...
- HDU 2509 Nim博弈变形
1.HDU 2509 2.题意:n堆苹果,两个人轮流,每次从一堆中取连续的多个,至少取一个,最后取光者败. 3.总结:Nim博弈的变形,还是不知道怎么分析,,,,看了大牛的博客. 传送门 首先给出结 ...
- HDU 1907 Nim博弈变形
1.HDU 1907 2.题意:n堆糖,两人轮流,每次从任意一堆中至少取一个,最后取光者输. 3.总结:有点变形的Nim,还是不太明白,盗用一下学长的分析吧 传送门 分析:经典的Nim博弈的一点变形. ...
- 51nod1072(wythoff 博弈)
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1072 题意: 中文题诶~ 思路: 博弈套路是有的, 找np局 ...
- ACM: NBUT 1107 盒子游戏 - 简单博弈
NBUT 1107 盒子游戏 Time Limit:1000MS Memory Limit:65535KB 64bit IO Format: Practice Appoint ...
- 【转】ACM博弈知识汇总
博弈知识汇总 转自:http://www.cnblogs.com/kuangbin/archive/2011/08/28/2156426.html 有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍 ...
随机推荐
- CF919F
题意: Alice和Bob玩游戏,每人各有8张牌,牌的大小在0~4之间 每次操作,先手可以选择自己一张牌和对方一张牌求和后%5,将新的牌替代自己拿出的那张牌,以此类推,直到有一个人手中的牌全部是0,则 ...
- 论文阅读笔记七:Structure Inference Network:Object Detection Using Scene-Level Context and Instance-Level Relationships(CVPR2018)
结构推理网络:基于场景级与实例级目标检测 原文链接:https://arxiv.org/abs/1807.00119 代码链接:https://github.com/choasup/SIN Yong ...
- 用JAVA写一个简单的英文加密器
package qhs; import java.util.Scanner; public class JiaM { public static void main(String[] args) { ...
- 史上最简单的SpringCloud教程 | 第五篇: 路由网关(zuul)
在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统.一个简答的微服务系统如下图: ...
- CMake在Visual Studio下保持目录结构
CMake在Visual Studio下保持目录结构 原理 主要通过CMAKE自带函数source_group来设定. 需要把add_executable()函数进行封装,包裹一层source_gro ...
- php抽奖概率算法
方法一: function get_rand($proArr) { $result = array(); foreach ($proArr as $key => $val) { $arr[$ke ...
- noip宝藏
题解: 我觉得状压比搜索不知道简单到哪里去了.. 为了练习搜索...想了一下这题的搜索.. 然后会发现想想就很容易想到dp.. 最后的搜索大概是这样的 我们会发现有一类搜索都是这样 你会重复(可能是指 ...
- python之string模块常量:数字,26个字母,标点符号,空白
In [8]: import string In [9]: dir(string) In [10]: string.ascii_letters Out[10]: 'abcdefghijklmnopqr ...
- ng2tree在ios中无法触发click
问题描述: 从其他页面跳转回ng2tree的页面时,无法触发节点的click事件 解决方案: 1. 在node_modules中搜索onNodeSeclected方法,修改click为touchend ...
- JMeter学习笔记2-图形界面简单介绍
废话少说直接干活的给: 一.打开和运行JMeter,出现UI界面.如图下所示: 工具栏:常见操作的图标集合,有New(新建), Template(模板) ,Save(保存),Start(开始) ,St ...