Codeforces Round #242 (Div. 2) C题

题目链接: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[10000002];


int main()
{
    int k=0,n;
    for (int i=1;i<=1000000;i++)
    num[i]=num[i-1]^i;
    cin>>n;
    long long ans=0,x;
    for (int i=1;i<=n;i++)
    {
        cin>>x;
        ans^=x;
    }
    
    for (int i=2;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%2==1)//如果是偶数就不用算了,抵消为0.
        ans^=num[i-1];//奇书,异或的值
       }
    cout<<ans<<endl;

    return 0;
}


原文地址:https://www.cnblogs.com/forgot93/p/3690032.html