圣桥桐香
takanashi_mifuru · · 题解
首先容易发现,对
然后给 SG 函数打个表,你发现如果
然后爆了,因为每次都要花根号回去找,但是你发现把同余数的判掉之后我只需要让这个先手必败点往后找点给他们标记成必胜就可以把他打成
#include<bits/stdc++.h>
using namespace std;
int q,n;
bool SG[60000005];
bool done[500005];
int main(){
scanf("%d%d",&q,&n);
int lim=n;
SG[0]=false;
done[0]=true;
for(int j=1;j*j<=lim;j++){
SG[j*j]=true;
}
int pos=0;
for(int i=1;i<=120*lim;i++){
pos++;
if(pos==lim)pos=0;
if(done[pos]){
SG[i]=true;
continue;
}
if(!SG[i]){
done[pos]=true;
for(int j=1;j*j<=lim;j++){
SG[i+j*j]=true;
}
continue;
}
}
while(q--){
int tmp;
scanf("%d",&tmp);
if(tmp>120*lim){
putchar('F');
}
else{
if(SG[tmp])putchar('F');
else putchar('B');
}
}
return 0;
}