http://www.lydsy.com/JudgeOnline/problem.php?id=3576
思路:由于数字巨大,因此N^2异或做法是过不了的,我们考虑将n个石子分成i堆,那么会有n%i堆n/i+1的石子,i-n%i堆n/i的石子。如果两个堆的石子数相同,那么他们异或起来就为0,因此,这两种石子堆,我们可以看做:每种至多只有1堆。这样就可以枚举n/i,然后可以避免计算很多重复的部分,时间复杂度为N^1.5
1 #include2 #include 3 #include 4 #include 5 #include 6 #define M 100100 7 int T,F,n,sg[2000005],v[2000005],ans; 8 int read(){ 9 int t=0,f=1;10 char ch=getchar();11 while (ch<'0'||ch>'9') { if (ch=='-') ch=-1;ch=getchar();}12 while ('0'<=ch&&ch<='9'){t=t*10+ch-'0';ch=getchar();}13 return t*f;14 }15 void init(){16 for (int i=0;i