poj 3252
2016-02-27 20:41
260 查看
题目链接:http://poj.org/problem?id=3252
题意:给定范围l,r;求有多少个数的二进制0的个数大于等于1的个数
题意:给定范围l,r;求有多少个数的二进制0的个数大于等于1的个数
#include <cstdio> #include <cstdlib> #include <cstring> using namespace std; typedef __int64 ll; int num[40]; ll dp[40][40][40];//dp[len][zero][one],len是数二进制的长度,zero是0的个数,one是1的个数 ll dfs(int len, int cntz,int cnto,bool zero,bool fp)//cntz数0的个数,cnto数1的个数,zero前面是否全部为0 { if(!len) { if(cntz >= cnto) return 1; return 0; } if(!fp && dp[len][cntz][cnto]!=-1) return dp[len][cntz][cnto]; int fpmax = fp ? num[len] : 1; ll ret = 0; int tzero,tone; for(int i = 0; i <= fpmax; i++) { tzero = cntz; tone = cnto; if(!zero && i==0) tzero++; if(i == 1) tone++; ret += dfs(len-1,tzero,tone,zero&&i==0,fp&&i==fpmax); } if(!fp) dp[len][cntz][cnto] = ret; return ret; } ll calc(int x) { int len = 0; while(x) { num[++len] = x%2; x/=2; } return dfs(len,0,0,true,true); } int main() { ll l,r; memset(dp,-1,sizeof(dp)); scanf("%I64d %I64d",&l,&r);//while(scanf("%I64d %I64d",&l,&r);去了while就过了,是我题意没看清吗? printf("%I64d\n",calc(r)-calc(l-1)); return 0; }
相关文章推荐
- 面向对象的学习笔记
- C语言中字符串的复制与memcpy函数
- 深度学习材料:从感知机到深度网络A Deep Learning Tutorial: From Perceptrons to Deep Networks
- Path Sum
- 调试寄存器(debug registers, DRx)理论及实践
- 编译测试 LLVM与LLDB
- 中国计算机学会CCF推荐国际学术会议和期刊目录(PDF版,2015年)
- 《机电传动控制》第一周作业
- Hadoop中两表JOIN的处理方法
- leetcode 332. Reconstruct Itinerary
- 蓝桥杯 历届试题 九数组分数
- 一篇幸福的自传-埃德.迪纳
- 使用Python list通过递归实现一个表达式计算器
- Javadoc的使用
- mybatis学习笔记(4)-开发dao方法
- CentOS 6.7下利用Rsyslog+LogAnalyzer+MySQL部署日志服务器
- Demo10:简单天猫导航
- 机器学习算法分类
- 一小时内解决这五道编程题才配叫程序员
- Java基本数据类型与位运算