[AtCoderContest010D]Decrementing

试题描述

There are \(N\) integers written on a blackboard. The \(i\)-th integer is \(A_i\), and the greatest common divisor of these integers is \(1\).

Takahashi and Aoki will play a game using these integers. In this game, starting from Takahashi the two player alternately perform the following operation:

  • Select one integer on the blackboard that is not less than \(2\), and subtract \(1\) from the integer.

  • Then, divide all the integers on the black board by \(g\), where \(g\) is the greatest common divisor of the integers written on the blackboard.

  • The player who is left with only \(1\)s on the blackboard and thus cannot perform the operation, loses the game. Assuming that both players play optimally, determine the winner of the game.

两个人玩游戏,他们轮流操作一个初始时最大公约数为 \(1\) 的序列,一次操作是将一个数减 \(1\),然后所有数除以它们的最大公约数,最终无法操作者输,问是否先手必胜。

输入

The input is given from Standard Input in the following format:

N
A_1 A_2 … A_N

输出

If Takahashi will win, print First. If Aoki will win, print Second.

输入示例1

3
3 6 7

输出示例1

First

输入示例2

4
1 2 4 8

输出示例2

First

输入示例3

5
7 8 8 8 8

输出示例3

Second

数据规模及约定

\(1 \le N \le 10^5\)

\(1 \le Ai \le 10^9\)

The greatest common divisor of the integers from \(A_1\) through \(A_N\) is \(1\).

题解

可能考虑奇偶性是一类博弈问题的思路吧。

首先,如果开始时全是奇数,注意到每次操作不会改变数的奇偶性,所以先手一定会将一个奇数变成偶数,那么后手就可以将这个偶数变回奇数,直到最终都变成了 \(1\)(全是奇数),所以后手必胜。

类似地,可以推广出:奇数个偶数,先手必胜;偶数个偶数,后手必胜。

但是有一个小 bug,如果开始时只有一个奇数,那么就不一定了,因为先手可能将那个奇数变成偶数,然后除以一下公约数,变成一个新局面。

当然这种情况很好处理,直接暴力模拟,直到“只有一个奇数”的局面消失,或者变成了全 \(1\) 序列,模拟次数不会超过 \(log_2max\{A_i\}\)。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std; int read() {
int x = 0, f = 1; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
return x * f;
} #define maxn 100010 int n, ceven, A[maxn]; int gcd(int a, int b) { return b ? gcd(b, a % b) : a; } int main() {
int sum = 0; bool has1 = 0, cur = 0;
n = read();
for(int i = 1; i <= n; i++) A[i] = read(), ceven += !(A[i] & 1), has1 |= (A[i] == 1), (sum += A[i] - 1) &= 1; if(has1) return puts(sum ? "First" : "Second"), 0;
if(ceven & 1) return puts("First"), 0;
if(n - ceven > 1) return puts("Second"), 0;
for(; ;) {
cur ^= 1;
for(int i = 1; i <= n; i++) if(A[i] & 1) A[i]--;
int g = A[1];
for(int i = 2; i <= n; i++) g = gcd(g, A[i]);
ceven = sum = has1 = 0;
for(int i = 1; i <= n; i++) A[i] /= g, ceven += !(A[i] & 1), has1 |= (A[i] == 1), (sum += A[i] - 1) &= 1;
if(has1) return puts((sum ^ cur) ? "First" : "Second"), 0;
if(n - ceven > 1) return puts(((ceven & 1) ^ cur) ? "First" : "Second"), 0;
} return 0;
}

[AtCoderContest010D]Decrementing的更多相关文章

  1. AGC010 - D: Decrementing

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

  2. Agc010_D Decrementing

    今天本人因调了上篇博客的题而脑壳不适,不想颓题,因此有了这篇博客. 但是博客毕竟得讲点什么,想想有没有什么代码短的. 哦,好像有,就Agc010_D Decrementing好了. Alice和Bob ...

  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. 菜鸟的数据库实战-4-数据阅读器SqlDataReader

    老铁们大家好啊,我是菜鸟思奎,今天我学习的是数据库和前端的连接用到的字符串,如果有什么纰漏希望大家在评论区指正.阿里嘎多. 我的环境是Visual Studio 2008 + Microsoft SQ ...

  2. Spark集群任务提交

    1. 集群管理器 Spark当前支持三种集群管理方式 Standalone—Spark自带的一种集群管理方式,易于构建集群. Apache Mesos—通用的集群管理,可以在其上运行Hadoop Ma ...

  3. 总结一下自己脑海里的JavaScript吧(一)--DOM模型

    今天是2019年6月25日,闲来无事,写一篇文章来看看自己脑袋里装了多少JavaScript知识! 这儿就第一章: 说起JavaScript,它是什么?后端脚本语言?前端编程语言?还是在网站浏览器上运 ...

  4. FZOJβ #31.字符串

    http://1572m36l09.iask.in:30808/problem/31 首先转化为保留尽量少的段使得字典序最大.考虑逐字符确定,显然我们可以将相同的连续字符缩在一起.注意到字典序最大的字 ...

  5. iBatis自动生成工具Abator

    https://blog.csdn.net/k_scott/article/details/8281837 ###首先创建数据库表,然后根据数据库表,生成相应的实体.及其配置文件 https://ww ...

  6. iOS下的2D仿射变换机制(CGAffineTransform相关)

    仿射变换简介 仿射变换源于CoreGraphics框架,主要作用是绘制2D级别的图层,几乎所有iOS设备屏幕上的界面元素都是由CoreGraphics来负责绘制.而我们要了解的2D仿射变换是其下负责二 ...

  7. 05tar命令详解

    tar 命令用于对文件进行打包压缩或解压,格式为"tar [选项][文件]". ​ 在Linux 系统中,常见的文件格式比较多,其中主要使用的是 .tar 或者 .tar.gz 或 ...

  8. destoon后台权限-不给客户创始人权限并屏蔽部分功能

    1.根目录下后台入口文件admin.php $_founder = $CFG['founderid'] == $_userid ? $_userid : 0;  //  $CFG['founderid ...

  9. 【java】 java 内存解读

    具体请参考 vamei java 内存管理和垃圾回收 java的内存分为栈内存和堆内存两部分 栈内存 主要存储一些参数,局部变量和返回地址,参数和局部变量大部分是基本类型的变量,如果是引用类型,实际上 ...

  10. 【php】instanceof

    instanceof 的使用还有一些陷阱必须了解.在 PHP 5.1.0 之前,如果要检查的类名称不存在,instanceof 会调用__autoload().另外,如果该类没有被装载则会产生一个致命 ...