链接:https://codeforces.com/gym/102059/problem/I
题意:给定N个点,围成一个圈,每次玩家选择两个点连线,不得与之前连的线相交。 如果玩家连线形成了一个多边形或者没有选的点,输。
题解:连一条边会划分成两个圈(子问题),跑sg函数
#include <bits/stdc++.h> using namespace std; const int maxn=5005; int sg[maxn], vis[maxn]; void calsg() { sg[0]=0; sg[1]=0; sg[2]=1; for(int i=3; i<maxn; i++) { memset(vis, 0, sizeof(vis)); for(int j=0; j<=i-2; j++) vis[sg[j]^sg[i-j-2]]=1; for(int j=0; ; j++) if(!vis[j]){ sg[i]=j; break; } } } int main() { calsg(); int T; for(cin>>T; T--; ) { int n; cin>>n; printf(sg[n]?"First\n":"Second\n"); } return 0; }