shuoj 418 丢史蒂芬妮(素数筛+sg函数)
代码:
#include<bits/stdc++.h> using namespace std; const int N=500+5; int SG[N][N]; bool S[N]; vector<int>prime; bool not_prime[N]; void get_SG(int n) { memset(SG,0,sizeof(SG)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { memset(S,false,sizeof(S)); for(int k=0;k<prime.size();k++) { if(j-prime[k]>=1)S[SG[i][j-prime[k]]]=true; else break; } for(int k=0;k<prime.size();k++) { if(i-prime[k]>=1)S[SG[i-prime[k]][j]]=true; else break; } for(int k=0;k<prime.size();k++) { if(j-prime[k]>=1&&i-prime[k]>=1)S[SG[i-prime[k]][j-prime[k]]]=true; else break; } for(int k=0;k<N;k++) if(!S[k]) { SG[i][j]=k; break; } } } } void get_prime(int n) { memset(not_prime,false,sizeof(not_prime)); for(int i=2;i<=n;i++) { if(!not_prime[i]) { prime.push_back(i); for(int j=i+i;j<=n;j+=i) { not_prime[j]=true; } } } } int main() { ios::sync_with_stdio(false); cin.tie(0); get_prime(500); get_SG(500); int t; cin>>t; while(t--) { int n,m; cin>>n>>m; if(SG[n][m])cout<<"Sora"<<endl; else cout<<"Shiro"<<endl; } return 0; }