从a枚举到b是一定会超时的。此题应该考虑数位dp,也可以理解为递推,假设给定数n,就能在O(32)复杂度算出所有小于等于n的数中1出现的次数,那么给定区间[a, b],solve(b) - solve(a - 1)就是答案。

把n化为二进制考虑,假设当前有k位前缀保持不变,且第k+1位为1,前缀中共有 cnt 个1,除去前k+1位,还剩余x位,那么答案应该增加 cnt * (2 ^ x) + h(x) ,h(x)表示这x位数字1的个数,注意x位中任意一位要么为0要么为1。一直递推即可得到答案,但是没有考虑n本身的1,所以最后把n的1加上就行了。

AC代码:

#include<cstdio>
#include<iostream>
using namespace std;
const int maxn = 35;
int w[maxn], h[maxn];
void deal(){
	h[0] = 0;
	w[0] = 1;
	w[1] = 2;
	h[1] = 1;
	for(int i = 2; i < 31; ++i) {
		w[i] = w[i - 1] * 2;
		h[i] = h[i - 1] + w[i - 1] + h[i - 1];
	}
}

int solve(int n){
	if(n == -1) return 0;
	int cnt = 0;
	int m = n;
	while(m > 0){
		if(m & 1) cnt++;
		m >>= 1;
	}
	int ans = cnt;
	for(int i = 1; n > 0; ++i, n >>= 1){
		//cout << i << '\n';

		if((n & 1) == 0) continue;
		cnt--;
		ans += cnt * w[i - 1] + h[i - 1];

	}
	return ans;
}

int test(int n){  //测试函数
	int ans = 0;
	for(int i = 1; i <= n; ++i){
		int w = i;
		while(w > 0){
			if(w & 1) ++ans;
			w >>= 1;
		}
	}
	return ans;
}

int main(){
	deal();
	int a, b;
	while(scanf("%d%d", &a, &b) == 2){
		printf("%d\n", solve(b) - solve(a - 1));
	}
	return 0;
}

如有不当之处欢迎指出!

nyoj222 整数中的1 数位DP的更多相关文章

  1. HDU-6156 Palindrome Function(数位DP)

    一.题目 二.思路 1.这是很明显的数位DP: 2.和以往数位DP不同的是,这里带了个进制进来,而以往做是纯十进制下或者纯二进制下做操作.但是,不管多少进制,原理都是一样的: 3.这里有个小坑,题目中 ...

  2. nyoj281 整数中的1(二) 数位DP

    和整数中的1一毛一样.就是输入时改了一下罢了. AC代码: #include<cstdio> const int maxn = 35; int w[maxn], h[maxn]; void ...

  3. 数位dp(求1-n中数字1出现的个数)

    题意:求1-n的n个数字中1出现的个数. 解法:数位dp,dp[pre][now][equa] 记录着第pre位为now,equa表示前边是否有降数字(即后边可不能够任意取,true为没降,true为 ...

  4. 剑指 Offer 43. 1~n 整数中 1 出现的次数 + 数位模拟 + 思维

    剑指 Offer 43. 1-n 整数中 1 出现的次数 Offer_43 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author ...

  5. 【BZOJ1662】[Usaco2006 Nov]Round Numbers 圆环数 数位DP

    [BZOJ1662][Usaco2006 Nov]Round Numbers 圆环数 Description 正如你所知,奶牛们没有手指以至于不能玩"石头剪刀布"来任意地决定例如谁 ...

  6. HDU2089 不要62[数位DP]

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  7. 【BZOJ-4521】手机号码 数位DP

    4521: [Cqoi2016]手机号码 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 303  Solved: 194[Submit][Status ...

  8. 【BZOJ-1833】count数字计数 数位DP

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 2494  Solved: 1101[Submit][ ...

  9. hdu3555 Bomb (记忆化搜索 数位DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory ...

随机推荐

  1. Eclipse设置代码自动提示

    Eclipse只需几步简单的设置就可以像idea那样代码自动提示了,喜欢的小伙伴可以赶紧动手设置,提升效率. 第一步:打开Eclipse --> Window --> Preference ...

  2. Ceph,TFS,FastDFS,MogileFS,MooseFS,GlusterFS 对比

    系统整体对比 对比说明 /文件系统 TFS FastDFS MogileFS MooseFS GlusterFS Ceph 开发语言 C++ C Perl C C C++ 开源协议 GPL V2 GP ...

  3. SQL Server ——动态SQL

    EXECUTE 执行 Transact-SQL 批中的命令字符串.字符串或执行下列模块之一:系统存储过程.用户定义存储过程.标量值用户定义函数或扩展存储过程.SQL Server 2005 扩展了 E ...

  4. android 设置TextView水平滚动和解决首行缩进问题

    android:ellipsize="marquee" android:focusable="true" android:focusableInTouchMod ...

  5. VUE脚手架搭建

    1.什么vue-cli    vue-cli是vue.js的脚手架,用于自动生成vue.js工程模板的. 步骤: 2.安装   ->全局安装   npm install vue-cli -g 或 ...

  6. 06_Linux系统常用命令

    一.命令使用方法 Linux命令格式 command [-option] [parameter1] [parameter2]... command:相应功能的英文单词或者单词的缩写 option:可用 ...

  7. 关于HTML的两个实例

    例子一:使用HTML语言编写一个菜单 代码如下: <!DOCTYPE html> <html> <head lang="en"> <met ...

  8. Yii AR中处理多表关联的relations配置

    关系型 Active Record官方文档中指出: 两张表之间的关联是根据外键来的,但是这种外键关联虽然在数据容错方面有益处,但是在性能上是个损伤,所以,一般是不定义外键的. 这种情况下,他们之间的关 ...

  9. ABP官方文档翻译 3.2 值对象

    值对象 介绍 值对象基类 最佳实践 介绍 "展现领域描述性层面且没有概念性身份的对象称之为值对象."(Eric Evans). 和实体相反,实体有身份标示(Id),值对象没有身份标 ...

  10. 【AIX】AIX内存机制

    [AIX]AIX内存机制 1  虚拟内存 虚拟内存是物理内存和交换空间(Paging Space)组合形成的虚拟内存空间, 通过虚拟的地址空间映射到物理内存或者 Paging Space. 在 AIX ...