hznu 校赛 Little Sub and Johann

编程入门 行业动态 更新时间:2024-10-07 00:25:53

<a href=https://www.elefans.com/category/jswz/34/1745280.html style=hznu 校赛 Little Sub and Johann"/>

hznu 校赛 Little Sub and Johann

Little Sub and Johann

这个题打个SG函数表找个规律就可以了,

先跑了前100个sg函数的值,

#include<bits/stdc++.h>
#define exp 1e-8
#define mian main
#define pii pair<int,int>
#define pll pair<ll,ll>
#define ll long long
#define pb push_back
#define PI  acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x)  priority_queue<x>
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
const int N=1e6+10;
int f[N],sg[N],s[N],num,;
void get_f(int x)
{num=0;for(int i=1;i<x;i++){if(__gcd(x,i)==1)f[++num]=i;}f[++num]=x;
}
void get_sg(int n)
{sg[0]=0;for(int i=1;i<=n;i++){get_f(i);met(s,0);for(int j=1;j<=num&&f[j]<=i;j++)s[sg[i-f[j]]]=1;for(int j=0;j<=n;j++){if(s[j]==0){sg[i]=j;break;}}}
}
int main()
{get_sg(100);for(int i=0;i<=100;i++)printf("%d : %d\n",i,sg[i]);
}

然后又手写了5,6个才发现了规律

sg[0]=0;

sg[1]=mex{sg[0]}=1;

sg[2]=mex{sg[0],sg[1]}=2;

sg[3]=mex{sg[0],sg[1],sg[2]}=3;

sg[4]=mex{sg[0],sg[1],sg[3]}=2=sg[2];

sg[5]=mex{sg[0],sg[1],sg[2].sg[3],sg[4]}=5;

sg[6]=mex{sg[0],sg[1],sg[5]}=2=sg[2]

当x是质数时,sg值为:如果x是n个素数,那么sg[x]=n+1;也就是素数表中的位置+1

当x是合数时,sg[x]=sg[y],   y为x的最小素因子

所以

#include<bits/stdc++.h>
#define exp 1e-8
#define mian main
#define pii pair<int,int>
#define pll pair<ll,ll>
#define ll long long
#define pb push_back
#define PI  acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x)  priority_queue<x>
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
const int N=1e6+10;
int f[N],sg[N],s[N],num,n,prime[N];
void get_f(int x)
{num=0;for(int i=1;i<x;i++){if(__gcd(x,i)==1)f[++num]=i;}f[++num]=x;
}
void get_sg(int n)
{sg[0]=0;for(int i=1;i<=n;i++){get_f(i);met(s,0);for(int j=1;j<=num&&f[j]<=i;j++)s[sg[i-f[j]]]=1;for(int j=0;j<=n;j++){if(s[j]==0){sg[i]=j;break;}}}
}
void getprime(int N)
{memset(prime,0,sizeof(prime));for(int i=2;i<=N;i++){if(!prime[i]){prime[++prime[0]]=i;sg[i]=prime[0]+1;}for(int j=1;j<=prime[0]&&prime[j]<=N/i;j++){prime[prime[j]*i]=1;sg[i*prime[j]]=sg[prime[j]];if(i%prime[j]==0)break;}}
}
int main()
{getprime(1000000);sg[1]=1;get_sg(100);/*for(int i=0;i<=100;i++)printf("%d : %d\n",i,sg[i]);*/int t;sc(t);while(t--){scanf("%d",&n);int ans=0;int x;for(int i=1;i<=n;i++){scanf("%d",&x);ans^=sg[x];}if(ans)printf("Subconscious is our king!\n");elseprintf("Long live with King Johann!\n");}
}

 

更多推荐

hznu 校赛 Little Sub and Johann

本文发布于:2024-03-12 09:50:56,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1731244.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:hznu   校赛   Johann

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!