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;
}