[题解]第十一届北航程序设计竞赛预赛——H.高中数学题

题目描述

解题思路

可以求得通项公式:an = 2n + 1,所以问题就变成等差数列求异或和,这个具体为什么对我还不能很好地解释清楚,先挖坑吧。

 

附:c++代码

 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 typedef unsigned long long llt;
 7 
 8 llt Cal(llt x, llt d, llt P, llt Num)
 9 {
10     llt ret = 0;
11     ret += (x / P) * Num;
12     x %= P;
13     ret += (d / P) * Num * (Num - 1) / 2;
14     d %= P;
15     if (d * Num + x < P)
16         return ret;
17     else
18         return ret + Cal((d * Num + x) % P, P, d, (d * Num + x) / P);
19 }
20 
21 llt My_Xor(llt l, llt r, llt d)
22 {
23     llt Num = r - l +1;
24     llt x = l * 2 + 1;
25     llt ans = 0, Sum, P = 1;
26     for (llt i = 1; i <= 36; i++)
27     {
28         Sum = Cal(x, d, P, Num);
29         if (Sum & 1)
30             ans += P;
31         P <<= 1;
32     }
33     return ans;
34 }
35 
36 int main()
37 {
38     //freopen("mi.in", "r", stdin);
39     //freopen("H.out", "w", stdout);
40     int n, i;
41     llt l, r, ans;
42     scanf("%d", &n);
43     for(i = 1; i <= n; i++)
44     {
45         //scanf("%I64d%I64d", &l, &r);
46         cin >> l >> r;
47         ans = My_Xor(l, r, 2);
48         //printf("%I64d\n", ans);
49         cout << ans <<endl;
50     }
51     return 0;
52 }
View Code

 

另一种思路

这是官方给出的题解。

posted @ 2015-12-15 20:45  zyy是一只超级大沙茶  阅读(223)  评论(0编辑  收藏  举报