码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-12-15 22:40:31      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

题目描述

技术分享

解题思路

可以求得通项公式: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

 

另一种思路

这是官方给出的题解。

技术分享

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

标签:

原文地址:http://www.cnblogs.com/CQBZOIer-zyy/p/5049460.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!