SG函数 2019- 杭师范校赛

时间:2023-03-09 17:34:19
SG函数    2019- 杭师范校赛
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+; int sg[maxn];
int f[maxn];
int s[maxn];
void make_SG()
{
memset(sg,,sizeof(sg));
int n=;
for(int i=;i<=n;i++)
{
memset(s,,sizeof(s));
for(int j=;j<=i;j++)
{
if(__gcd(i,j)== || i==j ) s[sg[i-j]]=;
}
for(int j=;;j++)
{
if(!s[j]) { sg[i]=j; break; }
}
}
/*for(int i=1;i<=100;i++)
{
cout<<i<<" "<<sg[i]<<endl;
}*/
} int p[maxn]; // 判断 质数
int prime[maxn]; // 质数
int SG[maxn];
int tot=;
void make_prime()
{
int n=maxn-;
SG[]=;
for(int i=;i<=n;i++)
{
if(p[i]==) {prime[++tot]=i; SG[i]=tot+; }
for(int j=;j<=tot && i*prime[j]<=n;j++)
{
p[i*prime[j]]=;
SG[i*prime[j]]=SG[prime[j]];
if(i%prime[j]==) break;
}
}
} int main()
{
make_SG();
make_prime(); //for(int i=1;i<=100;i++)
//cout<<sg[i]<<" "<<SG[i]<<endl; int T; cin>>T;
while(T--)
{
int n; cin>>n;
int x=;
for(int i=;i<=n;i++) { int a; cin>>a; x^=SG[a]; }
if(x==) cout<<"Long live with King Johann!"<<endl;
else cout<<"Subconscious is our king!"<<endl;
}
}