[agc010d]Decrementing

223人阅读 评论(0) 收藏 举报
分类:

前言

博弈题,还挺有趣。

题目大意

一个正整数序列,gcd为1。
两人轮流操作,每次选择一个>1的数将其-1。
然后d是新序列的gcd,将所有数除以d。
不能操作者输。

结论

初始gcd为1,一定存在至少一个奇数。
如果有奇数个偶数,先手是一定必胜的。
先手先操作一个偶数变成奇数(此时场上就至少2个奇数了,然后此时有偶数个偶数),然后看后手表演:
后手将一个奇数变成偶数,先手就再把这个偶数变成奇数。
后手将一个偶数变成奇数,先手可以把另一个偶数变成奇数。
可以发现中途任意时刻序列的gcd不会为偶数,因此不会改变序列每个元素的奇偶性。
这样下去先手就胜了。
那后手怎么胜呢?
有偶数个偶数吗?
似乎不太对,如果只有一个奇数的,先手就会上来先操作这个奇数,让场上出现偶gcd。
这种情况(偶数个偶数,且只有1个奇数)递归即可。
其余情况直接出解。

#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int maxn=100000+10;
int a[maxn];
int i,j,k,l,t,n,m;
int gcd(int a,int b){
    return b?gcd(b,a%b):a;
}
bool solve(){
    int i;
    fo(i,1,n)
        if (a[i]%2==1){
            /*if (a[i]==1){
                if (n%2==0) return 1;
                else return 0;
            }*/
            if (a[i]==1) return 0;
            a[i]--;
            break;
        }
    int d=a[1];
    fo(i,2,n) d=gcd(d,a[i]);
    fo(i,1,n) a[i]/=d;
    int t=0,l=0;
    fo(i,1,n)
        if (a[i]%2==0) t^=1;else l++;
    if (!t&&l==1) return solve()^1;
    else if (t) return 0;
    else return 1;
}
int main(){
    scanf("%d",&n);
    fo(i,1,n){
        scanf("%d",&a[i]);
        k=a[i];
        if (k%2==0) t^=1;else l++;
    }
    if (!t&&l==1){
        if (solve()) printf("First\n");else printf("Second\n");
        return 0;
    }
    if (t) printf("First\n");else printf("Second\n");
}
查看评论

AtCoder Grand Contest 010 D - Decrementing 博弈论

题意 有一个序列A,满足gcd(A[1],...,A[n])=1" role="presentation" style="position: relative;">gcd(A[1],...,A[n]...
  • qq_33229466
  • qq_33229466
  • 2018-02-05 22:17:03
  • 75

AGC010 - D: Decrementing

高智商游戏
  • VicJiao
  • VicJiao
  • 2017-10-24 21:42:12
  • 198

[agc010d]Decrementing

前言博弈题,还挺有趣。题目大意一个正整数序列,gcd为1。 两人轮流操作,每次选择一个>1的数将其-1。 然后d是新序列的gcd,将所有数除以d。 不能操作者输。结论初始gcd为1,一定存在至少...
  • WerKeyTom_FTD
  • WerKeyTom_FTD
  • 2017-10-14 11:38:54
  • 223

agc010d

题目大意 有一个有n个数(n&amp;lt;=1e5)的序列a,满足所有数的gcd为1 现在有a,b两个人轮流操作 每一次其中的一个人把一个大于1的数-1,然后所有数除当前序列的gcd 不能操...
  • Fate_Zero_Saber
  • Fate_Zero_Saber
  • 2018-02-25 22:04:05
  • 26

agc010 D - Decrementing

Problem Statement There are N integers written on a blackboard. The i-th integer is Ai, and the gre...
  • lijf2001
  • lijf2001
  • 2018-03-01 16:14:33
  • 30

【AtCoder】【AGC010D】Decrementing

Description 给出一个长度为n的序列aaa,A、B两个人轮流操作: 1. 选择一个不为1的数,将其-1; 2. 把序列中的所有数/g,g为所有数的gcd; 操作不了的人输。 S...
  • HOWARLI
  • HOWARLI
  • 2018-03-04 09:34:35
  • 31

IOI2018精英培训计划

清华集训: 清华集训给修记 集训队作业: cnt:104(+11)/104(+52) atc部分: agc001_d √ agc001_e √ agc002_d √ agc002_e ...
  • WerKeyTom_FTD
  • WerKeyTom_FTD
  • 2017-09-22 22:05:47
  • 1623

AtCoder Grand Contest 010D

vjudge传送门 题目大意: 给一个GCD为1的数列,有两个人每次选出一个数把这个数-1,然后把整个数列除以新数列的GCD,询问先手和后手哪个必胜。Solution: 不难看出这是一道...
  • Charlie_jilei
  • Charlie_jilei
  • 2017-09-08 13:22:11
  • 220

MS SQL 2005安装失败解决方案

在安装MS SQL Server 2005的时候,当安装到MSXML6时就会出错,日志如下: === Verbose logging started: 2009-9-16  18:27:09  Bui...
  • John_Yang
  • John_Yang
  • 2009-09-16 18:47:00
  • 5948

Incrementing and Decrementing Variables

Incrementing and Decrementing VariablesIf you wanted to add 1 to a variable, you could use the + ope...
  • zhujianyun
  • zhujianyun
  • 2006-07-02 16:10:00
  • 509
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 39万+
    积分: 1万+
    排名: 1456
    最新评论
    文章分类