求区间这种数的个数,这个数恰好等于k个互不相等的2的整数次幂之和 数位统计
来源:互联网 发布:人工智能不需要约束 编辑:程序博客网 时间:2024/05/21 02:49
Description
给定一个区间[x,y],求这个区间中满足下列条件的整数的个数:这个数恰好等于k个互不相等的2的整数次幂之和。例如x=15,y=20,k=2.则有且仅有下列三个数满足题意:
17=2^4+2^0;
18=2^4+2^1;
20=2^4+2^2;
(a^b代表是a的b次方)
Input
接下来输入T行,每行对应一个样例,每行有3个整数x, y, k(含义如上)。
第一行包含一个整数T,表示下面有T组数据。
数据规模:1<=x<=y<2^31-1 , 1<=k<=20 ;
Output
输出:每个样例对应一行,表示满足条件的数的个数。
Sample Input
215 20 21 100 4
Sample Output
326
也就是满足这个数的二进制里恰好有k个1。
比如13,1101,假设要求含3个1的个数,就等于紫色区域3个1的个数加上绿色区域2个1的个数加上紫色区域1个1的个数,如果这条路径本身满足则还要加1。
先初始化,用f[i][j]表示高度为i的完全二叉树的数中二进制恰好有j个1的数的个数,则有f[i][j]=f[i-1][j]+f[i-1][j-1]。
然后从31位循环到第1位(如果此时路径上的1已经超过要求就退出循环),用k表示目前已经路径上已经有几个1。如果这一位是1,就k++,并且把这一位变成0。如果下一位是1,就需要加上以这一位为根的左子树上满足k-K(K是题目要求的1)个1的个数。
也就是满足这个数的二进制里恰好有k个1。
比如13,1101,假设要求含3个1的个数,就等于紫色区域3个1的个数加上绿色区域2个1的个数加上紫色区域1个1的个数,如果这条路径本身满足则还要加1。
先初始化,用f[i][j]表示高度为i的完全二叉树的数中二进制恰好有j个1的数的个数,则有f[i][j]=f[i-1][j]+f[i-1][j-1]。
然后从31位循环到第1位(如果此时路径上的1已经超过要求就退出循环),用k表示目前已经路径上已经有几个1。如果这一位是1,就k++,并且把这一位变成0。如果下一位是1,就需要加上以这一位为根的左子树上满足k-K(K是题目要求的1)个1的个数。
#include<cstring>#include<cstdio>#include<iostream>#include<cmath>#include<algorithm>#include<queue>#define INF 0x3f3f3f3fusing namespace std;int f[35][35];int N,X,Y,K;void init(){ memset(f,0,sizeof(f)); f[0][0]=1; int i,j; for(i=1;i<=31;i++){ f[i][0]=f[i-1][0]; for(j=1;j<=i;j++) f[i][j]=f[i-1][j]+f[i-1][j-1]; }}int solve(int x){ int i,k=0,ret=0; for(i=31;i>0;i--){ if(x&(1<<i)){ k++; if(k>K) break; //此时路径上的1已经大于要求,不用再继续找 x^=1<<i; } if(x>=(1<<(i-1))) ret+=f[i-1][K-k]; //如果下一位是1,加上左子树有K-k个1的情况 } if(k+x==K) ret++; //判断这条路径本身是否满足条件 return ret;}int main(){ init(); scanf("%d",&N); while(N--){ scanf("%d%d%d",&X,&Y,&K); int ans=solve(Y)-solve(X-1); if(ans<0) ans=0; printf("%d\n",ans); } return 0;}
- 求区间这种数的个数,这个数恰好等于k个互不相等的2的整数次幂之和 数位统计
- 一个数如果恰好等于它的因子之和,这个数就称为完整数
- java小练习(一个数如果恰好等于它的因子之和,这个数就称为“完数”。编写应用程序,求1000之内的所有完数。)
- 一个数如果恰好等于它的因子之和 这个数就称为完数,求1000以内的完数
- 整数算法训练05—一个数如果恰好等于它的因子之和,这个数被成为”完数” 例如:6=1+2+3.请编程找出1000以内的完数
- (c#)题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"
- 【程序9】 WanShu.java 题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。
- 求正整数K的所有的次幂及所有有限的互不相等的次幂之和构成的递增数列;
- 题目:一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3
- 求1-1000内所有的完数(一个数如果恰好等于它的因子之和,这个数就称为“完数”。如6就是1个完数: 6=1+2+3,因子数就是所有可以整除这个数的数,但是不包括这个数自身.比如15的
- hdu3709(求区间内平衡数的个数)数位dp
- 一个数如果恰好等于它的因子之和,这个数就称为"完数",找出1000以内的所有完数。
- 一个数如果恰好等于它的因子之和,这个数就称为"完数",找出1000以内的所有完数。
- 求1000以内的完数(一个数恰好等于她的因子之和 eg. 6=1+2+3, 6是完数)
- 统计输入的整数区间内回文数的个数
- 题目:一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.编程 找出1000以内的所有完数。
- C100-19 题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。
- 题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。 例如6=1+2+3.编程 找出1000以内的所有完数。
- 数据库笔试、面试题大全
- 关于C++ code coverage tool 的研究
- c 语言的的 一些事
- 去IOE
- EXTJS4 CSDN地址
- 求区间这种数的个数,这个数恰好等于k个互不相等的2的整数次幂之和 数位统计
- Java开源框架(Struts、Hibernate、Spring)笔试面试大全
- linux平台下java获取本地ip的方法
- 判断参数是否是回文数
- UDP通信
- UVa 11549 计算器迷题(判重和Folyd判圈算法)
- Linux笔试、面试题大全
- Android手机暗码大全
- SQLite:电子词典