由于异或满足交换律,对于(1-n)%k (k=1,2,3..)
有n/i个(0 - k-1)和1个(0 - n%k)
方法1:区间操作num[i]表示前i个数都加上某一值。
方法2:预处理xor[i]表示1-i的异或值。根据n/i是否是奇数异或
#include<iostream>
#include<cstdio>
using namespace std;
int num[1000005];
int main(){
int n,ans=0,tt;
cin>>n;
for(int i=1;i<=n;i++){
int t=n/i;
int p=n%i;
if(t&1){
//for(int j=p+1;j<i;j++)
// ans^=j;
num[p+1]++;
num[i]--;
}
else{
//for(int j=0;j<=p;j++)
// ans^=j;
num[0]++;
num[p+1]--;
}
}
for(int i=1;i<=n;i++){
num[i]+=num[i-1];
if(num[i]&1)
ans^=i;
}
for(int i=1;i<=n;i++){
scanf("%d",&tt);
ans^=tt;
}
cout<<ans<<endl;
return 0;
}