Codeforces Round #242 (Div. 2) C. Magic Formulas (位异或性质 找规律)

题目

比赛的时候找出规律了,但是找的有点慢了,写代码的时候出了问题,也没交对,还掉分了。。。。

还是先总结一下位移或的性质吧:

1、  交换律 a ^ b = b ^ a

2、 结合律 (a^b) ^ c = a ^ (b^c)

3、 0^a = a;

4、 a^a = 0;    a^a^a = a;

5、   知道a,b,c中任意两个就能推知第三个.
      a^b = c 两边同时与a异或得: a ^ (a^b) = a^c 即 0^b = a^c  亦即 b = a^c 

      四个也是一样  若d = a ^ b ^ c  则a = d ^ b ^ c

     

 

 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <cmath>
 4 using namespace std;
 5 const int maxn = 1000000+10;
 6 
 7 __int64 p, ans, a[maxn];
 8 void init()
 9 {
10     int i;
11     a[0] = 0;
12     for(i = 1; i < maxn; i++)
13         a[i] = (a[i-1]^i);
14 }
15 int main()
16 {
17     int n, i, x;
18     while(cin>>n)
19     {
20         init();
21         ans = 0;
22         for(i = 1; i <= n; i++)
23         {
24             cin>>p;
25             ans ^= p;
26         }
27         for(i = 1; i <= n; i++)
28         {
29             if(n%(2*i) != 0)
30             {
31                 x = n%(2*i);
32                 if(x >= i)
33                     {
34                         ans ^= a[i-1];
35                         x -= i;
36                     }
37                 ans ^= a[x];  //把a[x]写成了x结果调试了一晚上
38             }
39         }
40         cout<<ans<<endl;
41     }
42     return 0;
43 }

 

转载于:https://www.cnblogs.com/bfshm/p/3693248.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值