您的位置:首页 > 其它

CF 424C Magic Formulas

2014-04-25 17:18 267 查看
由于异或满足交换律,对于(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: