hdu:http://acm.hdu.edu.cn/showproblem.php?pid=4588

题意:给你 a,b两个数,然后让a到b之间的数做2进制的加法,问你与多少次进位。例如:1,3,1+2+3=01+10+11=110,共有2次进位。

题解:这一题,如果直接暴力求解的话,肯定不行,数据很大。所以得转变思路,很容易想到,统计a到b每一位的1的个数,例如:1--3,01,10,11,右起第一位是2,往左是

2,所以一共有2/2+(2+1)/2=2种,所以结果是2. 接下来的问题就是如何统计每一位1的个数。110*110,对于*,如果*是1,那么从0到110*110,这一位就有(110)*2^3+(110+1),如果是*是0,则这一位有110*2^3,每一位一次类推,即可得到每一位1的个数,计算0--a-1,然后计算0-b,然后二者相剪,即可得到a到b之间的数据

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. using namespace std;
  7. int ans1[];
  8. int ans2[];
  9. int temp[];
  10. int a;
  11. int b;
  12. void solve(int x){
  13. int counts=;
  14. int s=x;
  15. memset(temp,,sizeof(temp));
  16. while(s){
  17. temp[counts]=s&;
  18. s/=;
  19. counts++;
  20. }
  21. counts--;
  22. for(int k=counts;k>=;k--){
  23. int sum1=,sum2=;
  24. int ct=;
  25. for(int j=k+;j<=counts;j++){
  26. sum1+=ct*temp[j];
  27. ct*=;
  28. }
  29. ct=;
  30. for(int j=;j<k;j++){
  31. sum2+=ct*temp[j];
  32. ct*=;
  33. }
  34. if(temp[k]==)
  35. ans1[k]=sum1*(<<(k-))+(sum2+);
  36. else
  37. ans1[k]=sum1*(<<(k-));
  38. }
  39. }
  40. int main(){
  41. while(~scanf("%d%d",&a,&b)){
  42. memset(ans1,,sizeof(ans1));
  43. memset(ans2,,sizeof(ans2));
  44. solve(a-);
  45. for(int i=;i<=;i++){
  46. ans2[i]=ans1[i];
  47. }
  48. memset(ans1,,sizeof(ans1));
  49. solve(b);
  50. for(int i=;i<=;i++){
  51. ans1[i]-=ans2[i];
  52. }
  53. int st=;
  54. for(int i=;i<=;i++){
  55. st+=ans1[i]/;
  56. ans1[i+]+=ans1[i]/;
  57. }
  58. printf("%d\n",st);
  59. }
  60. }

Count The Carries的更多相关文章

  1. HDU 4588 Count The Carries 数学

    Count The CarriesTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/ ...

  2. HDU 4588 Count The Carries 计算二进制进位总数

    点击打开链接 Count The Carries Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java ...

  3. HDU 4588 Count The Carries(数学统计)

    Description One day, Implus gets interested in binary addition and binary carry. He will transfer al ...

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

    题目 大意: 求二进制的a加到b的进位数. 思路: 列出前几个2进制,找规律模拟. #include <stdio.h> #include <iostream> #includ ...

  5. HDU 4588 Count The Carries (数学,计数)

    题意:给定两个十进制数,求二进制中,从x加到y的二进制进了多少位. 析:把这些数字的二进制纵向罗列出来,然后一位一位的把和加起来,最终得到总的进位数.从1到x,第i位上1的总数是x左移i+1位再右移i ...

  6. hdu 4588 Count The Carries

    思路:容易发现二进制表示的数的最低位规律是01010101……:接着是001100110011……:接着是:0000111100001111…… 这样我们发现每一位的循环节是2^(i+1),前2^i是 ...

  7. 2013 南京邀请赛 C count the carries

    /** 大意: 给定区间(a,b), 将其转化为二进制 计算从a+(a+1)+(a+2)....+(a+b-1),一共有多少次进位 思路: 将(a,b)区间内的数,转化为二进制后,看其每一位一共有多少 ...

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

    2013年南京邀请赛的铜牌题...做的非常是伤心.另外有两个不太好想到的地方.. ..a 能够等于零,另外a到b的累加和比較大.大约在2^70左右. 首先说一下解题思路. 首先统计出每一位的1的个数, ...

  9. nodejs api 中文文档

    文档首页 英文版文档 本作品采用知识共享署名-非商业性使用 3.0 未本地化版本许可协议进行许可. Node.js v0.10.18 手册 & 文档 索引 | 在单一页面中浏览 | JSON格 ...

随机推荐

  1. GDB技巧整理

    https://blog.atime.me/note/gdb-tricks.html 整理常用的gdb技巧. 常用命令 常用的gdb命令... 启动gdb 直接运行 gdb --args prog a ...

  2. 使用systemtap调试linux内核

    http://blog.csdn.net/heli007/article/details/7187748 http://linux.chinaunix.net/docs/2006-12-15/3479 ...

  3. Java基础知识强化16:深入分析Java线程中断机制

    1.Thread.interrupt真的能中断线程吗?       在平时的开发过程中,相信都会使用到多线程,在使用多线程时,大家也会遇到各种各样的问题,今天我们就来说说一个多线程的问题——线程中断. ...

  4. php 多维数组转换

    把字符类型转换成时间类型的,先用foreach遍历出来时间,在通过时间函数转换成时间格式; 例子: <?phpecho "<pre>";$lsrfield = a ...

  5. NP-难题

    所谓NP-难题,在给定的一个信息系统中,假设研究对象书目为m,属性书目为n,则要考察的属性集P的一个子集是否为最小子集,要进行n*m*m次的比较.而n个属性可构成2的n次方个子集,这些子集都有可能是最 ...

  6. ASP.NET MVC5框架揭秘 学习笔记01

    1.自治视图 在早期(作者也没说明是多早,自己猜吧),我们倾向于将所有与UI相关的操作糅合在一起(现在我身边还有很多人这样做),这些操作包括UI界面的呈现. 用户交互操作的捕捉与响应(UI处理逻辑). ...

  7. 判断浏览器是否支持FileReader

    1.js代码: //判断浏览器是否支持FileReader if (typeof FileReader == "undefined") { document.write(" ...

  8. Getting Started with Testing ——开始单元测试

    Android tests are based on JUnit, and you can run them either as local unit tests on the JVM or as i ...

  9. C#-日期格式表

    自定义格式表: 格式模式      说明 d                   月中的某一天.一位数的日期没有前导零. dd                 月中的某一天.一位数的日期有一个前导零. ...

  10. oracle数据表误删恢复

    1.查看回收站中的表: select object_name,original_name,partition_name,type,ts_name,createtime,droptime from re ...