CF2004E
套用 SG 函式的結論,我們先打單個遊戲的表再異或即可得到答案。首先對於一個大小為 \(i\) 的堆有 \(SG[i]=\text{mex}_{j\bot i}\{SG[j]\}\),容易暴力 dp。
int SG[N];
int f(int x) {
if(SG[x]!=-1) return SG[x];
if(x==0) return SG[0]=0;
vector<int> g;
up(i,1,x) if(__gcd(i,x)==1) g.pb(f(x-i));
sort(g.begin(),g.end());
if(g[0]>0) return 0;
up(i,0,(int)g.size()-2) if(g[i]+1!=g[i+1]&&g[i]!=g[i+1]) return g[i]+1;
return g[g.size()-1]+1;
}
觀察到結論,首先 \(SG[0]=0,SG[1]=1\),然後第 \(i\) 個質數的 SG 值是 \(i\) 強相關的,合數的 SG 是最小質因子的 SG,線性篩求出即可。