HDU 4588 Count The Carries

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4588

求a~b求和在二进制情况下共发生多少次进位。

1、将i转化成二进制,因为每一位只有出现多个1的时候才会产生进位。

2、所以,统计每一位1的个数即可。

3、统计1~b每一位1的个数,1~a-1中1的个数,作差即可。

    (对于怎么统计1~n的每一位1的个数,数学好的应该一眼能看出,数学不好的找找规律画画就行,不难的)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 
 5 using namespace std;
 6 long long a, b;
 7 
 8 long long cal( long long b, long long a ){
 9     b++, a++;
10     long long ans = 0;
11     unsigned long long p = 2, k = 1;
12     long long tmp = 0;
13     for( int i = 0; i < 62; ++i ){
14         long long cnt1_b = (b/p)*k;
15         long long cnt1_a = (a/p)*k;
16         if( b%p > k )
17             cnt1_b += (b%p)-k;
18         if( a%p > k )
19             cnt1_a += (a%p)-k;
20         long long cnt1 = cnt1_b - cnt1_a;
21         ans += ( cnt1 + tmp )/2;
22         tmp = ( cnt1 + tmp )/2;
23         p *= 2, k *= 2;
24     }
25     //cout << "p:" << p << " k:" << k << endl;
26 
27     return ans;
28 }
29 
30 int main(){
31     while( scanf("%I64d%I64d", &a, &b) != EOF ){
32         long long ans = cal( b, a-1 );
33         printf("%I64d\n", ans);
34     }
35 
36     return 0;
37 }
View Code

相关文章:

  • 2021-12-31
  • 2021-12-27
  • 2021-04-04
  • 2021-12-05
  • 2021-10-31
  • 2022-12-23
  • 2022-12-23
  • 2021-11-15
猜你喜欢
  • 2022-12-23
  • 2021-12-01
  • 2021-12-22
  • 2021-11-05
  • 2022-01-22
  • 2021-10-01
  • 2022-12-23
相关资源
相似解决方案