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之间的数据

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int ans1[];
int ans2[];
int temp[];
int a;
int b;
void solve(int x){
int counts=;
int s=x;
memset(temp,,sizeof(temp));
while(s){
temp[counts]=s&;
s/=;
counts++;
}
counts--;
for(int k=counts;k>=;k--){
int sum1=,sum2=;
int ct=;
for(int j=k+;j<=counts;j++){
sum1+=ct*temp[j];
ct*=;
}
ct=;
for(int j=;j<k;j++){
sum2+=ct*temp[j];
ct*=;
}
if(temp[k]==)
ans1[k]=sum1*(<<(k-))+(sum2+);
else
ans1[k]=sum1*(<<(k-));
}
}
int main(){
while(~scanf("%d%d",&a,&b)){
memset(ans1,,sizeof(ans1));
memset(ans2,,sizeof(ans2));
solve(a-);
for(int i=;i<=;i++){
ans2[i]=ans1[i];
}
memset(ans1,,sizeof(ans1));
solve(b);
for(int i=;i<=;i++){
ans1[i]-=ans2[i];
}
int st=;
for(int i=;i<=;i++){
st+=ans1[i]/;
ans1[i+]+=ans1[i]/;
}
printf("%d\n",st);
}
}

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. header的用法小结(转)

    php header()函数的具体作用是向客户端发送一个原始 HTTP 标头[Http Header]到客户端. 标头 (header) 是服务器以 HTTP 协义传 HTML 资料到浏览器前所送出的 ...

  2. 通过MultipleOutputs写到多个文件

    MultipleOutputs 类可以将数据写到多个文件,这些文件的名称源于输出的键和值或者任意字符串.这允许每个 reducer(或者只有 map 作业的 mapper)创建多个文件. 采用name ...

  3. Java NIO类库Selector机制解析--转

    一.  前言 自从J2SE 1.4版本以来,JDK发布了全新的I/O类库,简称NIO,其不但引入了全新的高效的I/O机制,同时,也引入了多路复用的异步模式.NIO的包中主要包含了这样几种抽象数据类型: ...

  4. 了解ANSI编码

    ANSI:American National Standards Institute:美国国家标准学会 ANSI编码:为使计算机支持更多语言,不同国家和地区分别制定了符合自身的外文字符延伸编码方式(如 ...

  5. 9.30 noip模拟试题

    时限均为1s,内存 256MB 1.某种密码(password.*) 关于某种密码有如下描述:某种密码的原文A是由N个数字组成,而密文B是一个长度为N的01数串,原文和密文的关联在于一个钥匙码KEY. ...

  6. JAVA学习笔记--二

    一.抽象类: 访问修饰符 abstract class 类名{ } 抽象类和普通类的区别: 1. 抽象类不能被实例化 2. 抽象类一般含有抽象方法 抽象方法:在抽象类中只有方法签名(方法声明),没有方 ...

  7. 浅谈inline-block

    一.区分block,inline,inline-block 1.block block元素会独占一行,多个block元素会各自新起一行.默认情况下,block元素宽度自动填满其父元素宽度. block ...

  8. win2008 64位下.net 无法访问oracle

    这两天换了台新机子,就想弄个新系统win2008 64bit来测试下,也尝尝新鲜,结果是碰的头破血流啊,哈哈就像挖宝似的 环境:win2008 64bit + IIS7+.net2.0 +ORACLE ...

  9. Store update, insert, or delete statement affected an unexpected number of rows ({0}).

    问题描述 Store update, insert, or delete statement affected an unexpected number of rows ({0}). Entities ...

  10. 表达式:使用API创建表达式树(3)

    一.DebugInfoExpression:发出或清除调试信息的序列点. 这允许调试器在调试时突出显示正确的源代码. static void Main(string[] args) { var asm ...