ARC143C

\(\text{Difficulty:} \color{Blue}{1697}\)

description

给定 \(n\) 堆石子,两个人轮流取,不能操作者败。

每次取选择若干堆石子,先手取走 \(x\) 个,后手取走 \(y\) 个。

判断胜负。

solution

首先考虑一堆石子 \(a\) 的情况。

显然先将 \(a\)\(x+y\) 取模,设 \(b=a\bmod (x+y)\)

不难发现,如果 \(b\ge x\),先手必赢,否则必输。

考虑 \(n\) 堆石子的情况。

首先可以想到,如果每一堆石子数对 \(x+y\) 取模得到的数都 \(< x\),那么先手必败,此时后手只要重复先手的操作即可。

然后考虑分讨 \(x,y\) 的大小关系。

  • \(x \le y\)

    此时先手必胜。

    因为存在至少一堆石子,其数量 \(a\) 满足 \(a \bmod(x+y) \le x \le y\),先手可以在第一步取满足条件的堆,之后模仿后手的操作,就能让后手最后无法操作。

  • \(x>y\)

    此时需要分讨(AT 数据水,这里直接输出后手必胜都能过)。

    考虑特殊情况。

    • 如果存在至少一堆石子,其数量 \(a\) 满足 \(y\le a \bmod (x+y)<x\),则后手必胜。

      此时后手可以选择模仿先手的操作,所有堆满足数量 \(<(x+y)\) 之后,因为 \(y<x\),所有先手可以操作的堆,后手都可以操作,所以后手必胜。

    • 反之,先手必胜。

code

#include <bits/stdc++.h>
using namespace std;

int main(){
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n,x,y;
  cin>>n>>x>>y;

  vector<int>a(n);
  bool f=0;
  for(int &i:a){
    cin>>i;
    i%=(x+y);
    f|=(i>=x);
  }

  if(!f){
    cout<<"Second\n";
  }
  else if(x<=y){
    cout<<"First\n";
  }
  else{
    f=0;
    for(int i:a){
      f|=(i>=y&&i<x);
    }
    if(!f){
      cout<<"First\n";
    }
    else{
      cout<<"Second\n";
    }
  }
  return 0;
}
posted @ 2022-12-27 16:58  AIskeleton  阅读(34)  评论(1编辑  收藏  举报