http://www.lydsy.com/JudgeOnline/problem.php?id=1228
打SG函数表,找规律:
若n是奇数m是奇数,则SG(n,m)=0
若n是偶数m是偶数,则SG(n,m)=SG(n/2,m/2)+1
若n是偶数m是奇数,则SG(n,m)=SG(n,m+1)
若n是奇数m是偶数,则SG(n,m)=SG(n+1,m)
#include<cstdio> #include<iostream> using namespace std; void read(int &x) { x=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } } int SG(int n,int m) { int ans=0; while(1) { if(n&1 && m&1) return ans; else if(n&1) n++; else if(m&1) m++; else { ans++; n>>=1; m>>=1; } } } int main() { int T,t,n,m,ans; read(T); while(T--) { read(t); t>>=1; ans=0; while(t--) { read(n); read(m); ans^=SG(n,m); } puts( ans ? "YES" : "NO" ); } return 0; }