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[]; 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 ;
}
上一篇:unix环境C编程之日期时间转换


下一篇:[转帖]Java中重写和重载与多态的关系