SG函数 2019- 杭师范校赛

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;

int sg[maxn];
int f[maxn];
int s[maxn];
void make_SG()
{
    memset(sg,0,sizeof(sg));
    int n=200;
    for(int i=1;i<=n;i++)
    {
        memset(s,0,sizeof(s));
        for(int j=0;j<=i;j++)
        {
            if(__gcd(i,j)==1 || i==j ) s[sg[i-j]]=1;
        }
        for(int j=0;;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=0;
void make_prime()
{
    int n=maxn-5;
    SG[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(p[i]==0) {prime[++tot]=i;  SG[i]=tot+1; }
        for(int j=1;j<=tot && i*prime[j]<=n;j++)
        {
            p[i*prime[j]]=1;
            SG[i*prime[j]]=SG[prime[j]];
            if(i%prime[j]==0) 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=0;
        for(int i=1;i<=n;i++) { int a; cin>>a; x^=SG[a]; }
        if(x==0) cout<<"Long live with King Johann!"<<endl;
        else     cout<<"Subconscious is our king!"<<endl;
    }
}
原文地址:https://www.cnblogs.com/Andromeda-Galaxy/p/10560468.html