题意:给出一个式子,求出它的值,用的是异或运算。
方法:因为异或运算是可以交换的,所以可以将Q的表达式改成p1^p2^...^pn^(1 mod 1)^(2 mod 1)^...^(1 mod 2)^(2 mod 2).....
可以发现模2 的余数的特点是1,0,1,0.。。。模3 的余数的特点是1,2,0,1,2,0.。。。所以可以用d[i]=1^2^...^(i-1)^0,d[i+1]=d[i]^i;
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 1000010
using namespace std;
int d[M],n,pp;
int main()
{
int i,mm;
while(scanf("%d",&n)!=EOF)
{
mm=0;
for(i=1;i<=n;i++)
{
scanf("%d",&pp);
mm=mm^pp;
}
d[1]=0;
for(i=2;i<=n;i++)
d[i]=d[i-1]^(i-1);
for(i=1;i<=n;i++)
{
int qq=n/i;
int rr=n%i;
//如果qq是偶数,由于a^a=0,所以mm不变
if(rr==0&&qq%2!=0)
mm=mm^d[i];
//当有余数的时候,要注意是把0也当成循环体的一部分,但余数部分一定不含有0,所以是和d[rr+1]做异或运算
if(rr!=0&&qq%2==0)
mm=mm^d[rr+1];
if(rr!=0&&qq%2!=0)
mm=mm^d[rr+1]^d[i];
}
printf("%d\n",mm);
}
return 0;
}