链接:http://poj.org/problem?id=3252

题意:一个数写成二进制,0不少于1就是round number,求给定区间内round number的个数。

分析:显然第一步转化为0到n的round number个数。。设n写成二进制有len位,第一位取0时,后面只要满足0的个数要求就行了,不用考虑是否比n大。。可以先预处理一下长度不大于len的round number个数,记做t[len],t[len]=t[len-1]+∑C(len-1  k) , (k=0,1,...,len/2-1)。

然后第一位取1时,往后是0的位只能取0,遇到第一个1时,再分情况考虑这一位为1和为0,然后考虑还需要多少位,往下递归即可。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 const int maxn=35;
 6 int C[maxn][maxn],sum[maxn][maxn][maxn],t[maxn];
 7 int start,finish;
 8 void CalC(){
 9     for(int i=1;i<maxn;i++)
10         C[i][0]=C[i][i]=1;
11     for(int i=2;i<maxn;i++){
12         for(int j=1;j<i;j++){
13             C[i][j]=C[i-1][j]+C[i-1][j-1];
14         }
15     }
16     for(int i=0;i<maxn;i++){
17         for(int s=0;s<=i;s++){
18             sum[i][s][s]=C[i][s];
19             for(int t=s+1;t<=i;t++){
20                 sum[i][s][t]=sum[i][s][t-1]+C[i][t];
21             }
22         }
23     }
24 }
25 void CalT(){
26     t[1]=1;
27     for(int i=2;i<maxn;i++){
28         t[i]=t[i-1]+sum[i-1][0][(i-2)/2];
29     }
30 }
31 int f(int n,int c,int len){
32     if(c==0)return 1;
33     if(c>=len)return n+1;
34     int t=len-1;
35     while(t>=0&&(n&(1<<(t-1)))==0){
36         t--;
37     }
38     return f(n-(1<<(len-1)),c-1,t)+sum[len-1][0][c];
39 }
40 int solve(int n){
41     if(n==0)return 1;
42     int k=1<<30,len=31;
43     while((k&n)==0){
44         k>>=1;len--;
45     }
46     int l=len-1;
47     while(l>=0&&(n&(1<<(l-1)))==0){
48         l--;
49     }
50     return t[len-1]+f(n-(1<<(len-1)),(len-2)/2,l);
51 }
52 //bool Is_round(int n){
53 //    int k=1,a=0,b=0;
54 //    while(k<=n){
55 //        if(k&n)a++;
56 //        else b++;
57 //        k<<=1;
58 //    }
59 //    if(a<=b)return true;
60 //    return false;
61 //}
62 //int test(int n){
63 //    int count=0;
64 //    for(int i=1;i<=n;i++){
65 //        if(Is_round(i))count++;
66 //    }
67 //    return count+1;
68 //}
69 int main(){
70     CalC();
71     CalT();
72     int n;
73 //    while(cin>>n){
74 //        cout<<solve(n)<<' '<<test(n)<<endl;
75 //    }
76     cin>>start>>finish;
77     cout<<solve(finish)-solve(start-1)<<endl;
78     return 0;
79 }

转载于:https://www.cnblogs.com/7391-KID/p/7282581.html

poj 3252 Round Numbers(数学)相关推荐

  1. POJ 3252 Round Numbers

    解题思路: 1. d[i][j]表示需i位二进制表示且1的个数不大于j(首位为1)的数的总和 2. 对数a,假设其二进制需要i位表示 a)求不大于a round Number总和 Line 6~8 b ...

  2. POJ - 3252 Round Numbers(数位dp)

    题目链接:点击查看 题目大意:规定一个数如果二进制中0的个数大于等于1的个数,则这个数称为"整数",问闭区间a,b中有多少个整数 题目分析:数位dp,dp[pos][c0][c1] ...

  3. pku 3252 Round Numbers 组合数学 找规律+排列组合

    http://poj.org/problem?id=3252 看了discuss里面的解题报告才明白的,这个解题报告太强大了:http://poj.org/showmessage?message_id ...

  4. Poj 1338 Ugly Numbers(数学推导)

    一.题目大意 本题要求写出前1500个仅能被2,3,5整除的数. 二.题解 最初的想法是从1开始检验该数是否只能被2,3,5整除,方法是这样的,对于一个数,如果它能被2整除,就除以2,如果它能被3整除 ...

  5. Round Numbers POJ - 3252(数位dp+判断前导零)

    题意 求二进制表示中0的个数大于1的数的个数. 题目 The cows, as you know, have no fingers or thumbs and thus are unable to p ...

  6. 牛客假日团队赛5 F 随机数 BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 (dfs记忆化搜索的数位DP)...

    链接:https://ac.nowcoder.com/acm/contest/984/F 来源:牛客网 随机数 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...

  7. Round Numbers

    题意/Description: 正如你所知,奶牛们没有手指以至于不能玩"石头剪刀布"来任意地决定例如谁先挤奶的顺序.她们甚至也不能通过仍硬币的方式.        所以她们通过&q ...

  8. BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数(数位DP+恶心细节)

    BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 Time Limit: 5 Sec  Memory Limit: 64 MB Description 正如你所知 ...

  9. bzoj 1662: [Usaco2006 Nov]Round Numbers 圆环数(枚举)

    1662: [Usaco2006 Nov]Round Numbers 圆环数 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 413  Solved: 2 ...

最新文章

  1. MySQL删除匿名用户,保证登录安全
  2. mysql b 树删除操作,B-树的删除过程介绍
  3. python好学吗mooc中文网-用Python玩转数据
  4. python sklearn下载了但是引用失败_关于python:导入sklearn时出错
  5. linux下 tar解压 gz解压 bz2等各种解压文件使用方法
  6. 递归求和的复习-计算m~n整数和
  7. 瑞幸咖啡自曝虚假交易 22 亿,App 反冲 TOP 1
  8. ViewPager之使用PagerTabStrip添加标题栏,实现滑动效果
  9. 浮点数规格化-不同基数的规格化
  10. 用 Flutter 写一个精美的登录页面(最新版)
  11. 移植交叉编译pcDuino + busybox 成功搭建最小linux系统
  12. EOJ 306 树上问题
  13. 二十、oracle pl/sql基础
  14. Iometer存储测试工具参数说明- 2 Access Specifications
  15. vue获取微信登陆权限_vue微信授权登录
  16. 西瓜书习题4.3 决策树
  17. Jarvis OJ BASIC 公倍数
  18. DNSPod十问梁定安: 工业互联网唤醒制造业的第二个春天
  19. 项目管理(PMP)项目沟通管理
  20. 计算机四级网络工程师属于什么职称,计算机四级网络工程师和软考网络工程师有什么区别...

热门文章

  1. 程序无法启动计算机丢失,没法启动程序,说是计算机丢失user32.dll
  2. python 编程服务_Python编写Windows Service服务程序
  3. python自动化办公是什么_python自动化办公?学这些就够用了
  4. linux多cpu运行python脚本,linux系统使用python获取cpu信息脚本分享
  5. java中两个xml文件内容拼接_比较Java中2个XML文档的最佳方法
  6. 中科大计算机是一流学科吗,2016安徽省大学一流学科排行榜,中科大第一
  7. svd pca matlab,从SVD到PCA——奇妙的数学游戏
  8. java .class参数_java – 将.getClass()转换为类型参数
  9. oracle数据库连接不稳定,Oracle数据库自连接查询的缺点及解决方法
  10. java 鼠标拖动画矩形_java怎么实现鼠标在桌面拖动过程中 画 矩形的 功能?