[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. pip和apt-get换源

    pip换源 一下方法对pip和pip3同时起作用 永久换源 运行一下命令: cd ~/.pip 如果提示目录不存在的话,我们要自行创建一个,再进入目录 mkdir ~/.pip cd ~/.pip 在 ...

  2. debian常用指令

    查看软件xxx安装内容 dpkg -L xxx 查找软件 apt-cache search 正则表达式 查找文件属于哪个包 dpkg -S filename apt-file search filen ...

  3. TabControl重写,添加关闭按钮

    class userTabControl : TabControl { const int CLOSE_SIZE = 15; protected override void OnInvalidated ...

  4. POJ-1961-Period(ZOJ-2177)

    这题是最短循环节,然后我们尝试小于字符串长度的所有长度,如果符合,我们就输出. 如果它等于0,说明它不循环,因为之前并没有重复的,如果i%(i-next[i])==0说明它是循环的,然后除一下得到周期 ...

  5. 01、Linux介绍

    一. Linux介绍 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件.应用程序和 ...

  6. spdlog&rapidjson 使用记录

    项目中需要记录log以及读写json,对比后选择了spdlog以及rapidjson. SPDLog 对于log只是要求能够记录到文件中以及能够过滤,选择spdlog是因为这个只需要包含头文件即可使用 ...

  7. 如何用 CSS 和 D3 创作旋臂粒子动画

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/xJrOqd 可交互视频 ...

  8. biological clock--class

    '''this application aimed to cauculate people's biological block about emotional(28), energy(23),int ...

  9. 18/07/2017 R matrix

    矩阵:二维数组,元素拥有相同模式(数值型,字符型或者逻辑型) mymatrix <- matrix (vector, nrow_num_of_rows, ncol_num_of_columns, ...

  10. stm32L0系列学习(一)

    开发用到的具体芯片是stm32L011F3 stm32L0总体特性,定位: 可见容量是比较少的,功耗很低,adc12位,7种低功耗模式 jlink和sdk的引脚关系图: HAL的库框图 官方给出的HA ...