思路:直接用SG函数会超时,对SG函数打一下表找规律。可以发现
当x为质数时,sg[x]=x是第几个质数+1。
当x不为质数时,sg[x]=sg[p]且p是x的最小质因子。
#include<iostream>
#define ll long long
#include <stdio.h>
#include <string.h>
#define N 1000000+10
ll SG[N],S[N],a[N];
ll cnt;
int num[N];
bool prime[N];
void getSG(){
prime[0]=prime[1]=1;
SG[1]=1;
for(int i=2;i<N;i++){
if(!prime[i]){
num[++cnt]=i;
SG[i]=cnt+1;
}
for(int j=1;j<=cnt&&i*num[j]<N;j++){
prime[i*num[j]]=1;
SG[i*num[j]]=SG[num[j]];
if(i%num[j]==0){
break;
}
}
}
}
int main(){
ll t,n;
getSG();
scanf("%lld",&t);
while(t--){
scanf("%lld",&n);
ll ans;
for(ll i=0;i<n;i++){
scanf("%lld",&a[i]);
}
ans=SG[a[0]];
for(ll i=1;i<n;i++){
ans^=SG[a[i]];
}
if(ans){
printf("Subconscious is our king!\n");
}
else{
printf("Long live with King Johann!\n");
}
}
return 0;
}