2013 南京邀请赛 C count the carries


 1 /**
2 大意: 给定区间(a,b), 将其转化为二进制 计算从a+(a+1)+(a+2)。。。。+(a+b-1),一共有多少次进位
3 思路: 将(a,b)区间内的数,转化为二进制后,看其每一位一共有多少个1
4 可知最低位循环为2,第二位循环为4
5 ---〉 所以每一位的1的个数为 : 假设为第三位 (n-n%8)/8*8/2===>(n-n%8)/2
6 ------> 如果n%8 大于8/2 那么应该再加上 n%8-8/2
7 **/
8 #include <iostream>
9 #include <cstring>
10 using namespace std;
11
12 void cal(int num[],int n){
13 long long mod =1;
14 n++;
15 for(int i=0;i<64;i++){
16 if(mod>n)
17 break;
18 mod = mod*2;
19 num[i] += (n-n%mod)/2;
20 if(n%mod > mod/2) num[i] += n%mod-mod/2;
21 }
22 }
23 int main()
24 {
25 long long a,b;
26 int anum[100],bnum[100];
27 while(cin>>a>>b){
28 memset(anum,0,sizeof(anum));
29 memset(bnum,0,sizeof(bnum));
30 cal(anum,a-1);
31 cal(bnum,b);
32 for(int i=0;i<64;i++)
33 bnum[i]-=anum[i];
34 long long ans = 0;
35 for(int i=0;i<64;i++){
36 ans += bnum[i]/2;
37 bnum[i+1] += bnum[i]/2;
38 }
39 cout<<ans<<endl;
40 }
41 return 0;
42 }

2013 南京邀请赛 C count the carries

时间: 2024-10-12 20:19:29

2013 南京邀请赛 C count the carries的相关文章

hdu 4587 2013南京邀请赛B题/ / 求割点后连通分量数变形。

题意:求一个无向图的,去掉两个不同的点后最多有几个连通分量. 思路:枚举每个点,假设去掉该点,然后对图求割点后连通分量数,更新最大的即可.算法相对简单,但是注意几个细节: 1:原图可能不连通. 2:有的连通分量只有一个点,当舍去该点时候,连通分量-1: 复习求割点的好题! #include<iostream> #include<cstdio> #include<vector> using namespace std; int n,m; vector<vector&

2013 南京邀请赛 A play the dice 求概率

1 /** 2 大意:给定一个色子,有n个面,每一个面上有一个数字,在其中的m个面上有特殊的颜色,当掷出的色子出现这m个颜色之一时,可以再掷一次..求其最后的期望 3 思路:假设 期望为ans 4 ans = 1/n*(a[b[1]]+ans)+1/n*(a[b[2]]+ans)+....+1/n*(a[b[m]]+ans) +...+1/n*(a[k]).... 5 ans = m/n*ans+1/n*(a[1]+a[2]+a[3]+...a[n]) 6 ans = m/n*ans+sum/n

2013 南京邀请赛 K题 yet another end of the world

1 /** 2 大意:给定一组x[],y[],z[] 确定有没有两个不同的x[i], x[j] 看是否存在一个ID使得 3 y[i]<=ID%x[i]<=z[i] 4 y[j]<=ID%x[j]<=z[j] 5 设ID%x[i] = a ID%x[j] = b 6 ===〉ID+x[i]*x=a, ID+x[j]*y = b; 7 两式相减得 x[j]*y - x[i]*x = b-a; 8 若是有解 就是(b-a)%gcd(x[i],x[j]) == 0 9 就是看b-a的范围内

HDU 4588 Count The Carries 数位DP || 打表找规律

2013年南京邀请赛的铜牌题...做的很是伤心,另外有两个不太好想到的地方....a 可以等于零,另外a到b的累加和比较大,大约在2^70左右. 首先说一下解题思路. 首先统计出每一位的1的个数,然后统一进位. 设最低位为1,次低位为2,依次类推,ans[]表示这一位上有多少个1,那么有 sum += ans[i]/2,ans[i+1] += ans[i]/2; sum即为答案. 好了,现在问题转化成怎么求ans[]了. 打表查规律比较神奇,上图不说话. 打表的代码 #include <algo

2013 长沙邀请赛 ADEGH 题解

HDU 4565 So Easy! 类似fib的构造 设Fn = x + y*sqrt(b) 啪啦啪啦 #include <cstdio> #include <cstring> #include <vector> #include <cmath> #include <iostream> using namespace std; typedef vector<long long> vec; typedef vector<vec&g

HDU 4588 Count The Carries(找规律,模拟)

题目 大意: 求二进制的a加到b的进位数. 思路: 列出前几个2进制,找规律模拟. #include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <math.h> #include <stack> #include <vector> using namespace std; int main() { int

A Computer Graphics Problem 4176 2013上海邀请赛

A Computer Graphics Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 968    Accepted Submission(s): 688 Problem Description In this problem we talk about the study of Computer Graphics.

HDU 4588 Count The Carries (2013年南京邀请赛)

题目地址:HDU 4588 这题是学长跟我说的一道数位DP..然后我就按着数位DP去做的,倒是写出来了,但是一直TLE..后来用类似找规律的方法解出来了.. 首先这题其实就是求每位上总共有多少个1,然后不断从低位开始向高位进位. 方法是比如二进制为1010010的这个数,就可以拆成1000000+10000+10三个数,然后从0到111111就是0和1的一个全排序,那么每一位上的1的个数总和一定是占一半,然后首位+1,那么10000也可以这样算,然后累加起来就好了.但是还要注意的是,首位的1不只

HDU 4588 Count The Carries(数学 二进制 找规律啊)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4588 Problem Description One day, Implus gets interested in binary addition and binary carry. He will transfer all decimal digits to binary digits to make the addition. Not as clever as Gauss, to make th