C:Magic Formulas
按位异或运算定义,
1 ^ 1=0
1 ^ 0=1
0 ^ 1=1
0 ^ 0=0
按位异或运算的规律是
定理一a ^ b = b ^ a
定理二 a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;
定理三 a ^ b ^ a = b, a ^ a^ b = b, b ^ a^ a = b
定理四若d = a ^ b ^ c,则a = d ^ b ^ c
知道异或运算的规律想必这题就很简单了。
#include <stdio.h>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <math.h>
#include <string.h>
#define LL long long
#define _LL __int64
using namespace std;
const int INF = 0x3f3f3f3f;
int a[1000010];
int mod[1000010];
//mod[i]表示 1^2^...^i。
void init()
{
mod[1] = 1;
for(int i = 2; i <= 1000000; i++)
mod[i] = mod[i-1]^i;
}
int main()
{
init();
int n;
int ans;
while(~scanf("%d",&n))
{
for(int i = 1; i <= n; i++)
scanf("%d",&a[i]);
ans = a[1];
for(int i = 2; i <= n; i++)
ans ^= a[i];
ans ^= 0;
for(int i = 2; i <= n; i++)
{
int t = n/i;
int m = n%i;
if(m == 0)
{
if(t&1)
{
ans ^= 0;
ans ^= mod[i-1];
}
}
else
{
if(t&1)
{
ans ^= 0;
ans ^= mod[i-1];
ans ^= mod[m];
}
else
{
ans ^= mod[m];
}
}
}
printf("%d\n",ans);
}
return 0;
}