首先易得,答案与
C
i
m
o
d
(
a
+
b
)
C_i\bmod (a+b)
Cimod(a+b) 相同。超现实数
于是我们可以大力分讨。
设
a
<
b
a<b
a<b
①
a
<
C
i
≤
b
a<C_i\leq b
a<Ci≤b ,那么只能 Alice 选,对 Alice 有
C
i
a
\frac{C_i}{a}
aCi 的贡献
②
b
<
C
i
b<C_i
b<Ci ,那么对于两人分别有
C
i
a
−
1
,
C
i
b
−
1
{\frac{C_i}{a}-1,\frac{C_i}{b}-1}
aCi−1,bCi−1 的贡献。(因为这几步必须先选,所以减一)。按照两者和从大到小排序,用数据结构(线段树或平衡树)维护奇偶前缀和。
最后记得讨论最后操作先后手。
#include<bits/stdc++.h>
#define N 100005
typedef long long ll;
using namespace std;
inline ll read(){
ll x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
struct node{
ll a,b;
bool operator<(const node x)const{return a+b>x.a+x.b;}
}que[N];
int tot=0;
int main(){
int n=read();
ll A=0,B=0;
while(n--){
ll x=read(),a=read(),b=read();
x%=(a+b);
if(x>=max(a,b)){
que[++tot].a=x/a-1,que[tot].b=x/b-1;
}else{
if(x>=a){
A+=x/a;
}
if(x>=b){
B+=x/b;
}
}
sort(que+1,que+1+tot);
ll na=A-B,nb=B-A;
for(int i=1;i<=tot;++i){
if(i&1){
na+=que[i].a;
nb+=que[i].b;
}else{
na-=que[i].b;
nb-=que[i].a;
}
}
na=(na>0)|((na==0)&(tot&1));
nb=(nb>0)|((nb==0)&(tot&1));
if(na&&nb){
puts("First");
}
if(na&&nb==0){
puts("Alice");
}
if(na==0&&nb){
puts("Bob");
}
if(na==0&&nb==0){
puts("Second");
}
}
return 0;
}