题目链接:http://codeforces.com/contest/424/problem/C,
想来一个小时,就是做不出,都做出来了,悲剧!
分析:我们知道交换异或的顺序不影响答案!
然后就是求t=a1^a2^a3^.....^an;这个直接做可以,
q=(1%i)^(2%i)... ^(n^i);(1<=i<=n);
//继续写完
当时我的想法是通过找规律,把1-n-1的个数都找出来,但是这个规律找不出。
后来知道有循环节这回事
比如:i=10的时候,循环节是1,2,3,4,。。9,如果有偶数个循环节,就不用做了,异或的关系,然后算那些没有抵消的项。
对于这个以为找到各个(i)的次数 能搞定,结果发现不能得出,我想多了!
先贴代码: #include<iostream>
#include<math.h>
using namespace std;
int num[]; int main()
{
int k=,n;
for (int i=;i<=;i++)
num[i]=num[i-]^i;
cin>>n;
long long ans=,x;
for (int i=;i<=n;i++)
{
cin>>x;
ans^=x;
}
for (int i=;i<=n;i++) {
ans^=num[n%i];//考虑可能留下的数,比如:1%4=1,2%4=2,3%4=3,4%4=0,5%4=1,那么这个1就没在循环节中,要考虑
if (n/i%==)//如果是偶数就不用算了,抵消为0.
ans^=num[i-];//奇书,异或的值
}
cout<<ans<<endl; return ;
}