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 }