zoukankan      html  css  js  c++  java
  • 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;
    }


  • 相关阅读:
    JDK动态代理源码解析
    Drools规则引擎-判断集合(List)是否包含集合
    Drools规则引擎-memberOf操作
    我对于今目标的反思
    UltraEdit的配置
    演讲的注意事项
    原型的安装及使用
    java异常的一些小知识
    网络攻击技术开篇——SQL Injection
    机房重构之接口
  • 原文地址:https://www.cnblogs.com/forgot93/p/3690032.html
Copyright © 2011-2022 走看看