URAL1057 Amount of Degrees 数位DP
来源:互联网 发布:揭秘egd网络黄金 编辑:程序博客网 时间:2024/05/18 02:30
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1057
题目大意:统计区间[x,y]内可以用k个不同的b进制数的和来表示的数的个数。
分析:参考论文《浅谈数位类统计问题》。我们先来看该问题的简化版:统计区间[0,n]内可以用k个不同的二进制数的和来表示的数的个数。那么对于n=13(二进制位1101),k=3的情况,我们只需要找到区间[0,13]内二进制数含有3个1的数的个数即可,这样每一位都对应一个2^k。接下来我们再来看着个问题,对于 一个b进制的数n,我们可以先计算出b进制数只含0和1的不大于n的数n',然后从区间[0,n']中进行查找即可。
实现代码如下:
#include <cstdio>#include <cstring>using namespace std;int f[35][35]; //f[i][j]表示低i位中含有j个1的二进制数的个数void init(){ memset(f,0,sizeof(f)); f[0][0]=1; for(int i=1;i<=31;i++) { f[i][0]=1; for(int j=1;j<=i;j++) f[i][j]=f[i-1][j-1]+f[i-1][j]; }}int calc(int x,int k) //统计区间[0,x]内二进制含有k个1的数的个数{ int cnt=0; //当前含有1的个数 int ans=0; //返回值 for(int i=31;i>0;i--) { if(cnt>=k) break; if(x&(1<<i)) { cnt++; x^=(1<<i); //将x的最高位的1变为0 } if( (1<<(i-1))<=x ) ans+=f[i-1][k-cnt]; } if(cnt+x==k) ans++; //要考虑x最低位是否为1 return ans;}int dig[35];int change(int x,int b) //将x转换为不大于x的B进制只含01的数{ int len=0,ans=0; while(x) { dig[len++]=x%b; x/=b; } for(int i=len-1;i>=0;i--) { if(dig[i]>1) { for(int j=i;j>=0;j--) ans|=(1<<j); } else ans|=dig[i]<<i; } return ans;}int main(){ init(); int x,y,k,b; while(scanf("%d%d",&x,&y)!=-1) { scanf("%d%d",&k,&b); x=change(x-1,b); y=change(y,b); printf("%d\n",calc(y,k)-calc(x,k)); } return 0;}
0 0
- [ural1057]Amount of Degrees && 数位DP
- URAL1057 Amount of Degrees 数位DP
- ural1057 Amount of Degrees 数位dp
- ural1057 Amount of Degrees 【数位dp】论文例题
- ural1057. Amount of Degrees
- ural1057 Amount of Degrees数位统计入门题
- [数位dp] ural 1057 Amount of Degrees
- ural 1057 Amount of Degrees(数位DP)
- ural 1057 Amount of degrees 【数位dp】
- 【URAL】1057 Amount of Degrees 数位DP
- URAL 1057 Amount of Degrees (数位dp)
- 数位DP-URAL-1057-Amount of Degrees
- 【URAL 1057】 Amount of Degrees 【数位DP】
- 【数位DP】URAL 1057 Amount of Degrees
- URAL 1057 Amount of Degrees(数位dp)
- URAL 1057 Amount of Degrees 数位DP *
- URAL - 1057 Amount of Degrees--数位dp
- URAL 1057 Amount of Degrees 数位dp
- 播放器项目正式启动
- javaMail使用imap协议接收邮件
- jQuery搜索同辈元素方法
- grid---样式
- JavaWriter源码分析
- URAL1057 Amount of Degrees 数位DP
- (NO.00001)iOS游戏SpeedBoy Lite成形记(一)
- 【MySQL】【leetcode】 Customers Who Never Order解题报告
- for what? so what?
- 基本C++概念
- jQuery搜索子元素的方法教程
- mysql 如何设置自动增长序列 sequence(一)
- qemu-2.4.0编译时出错:error: ‘XFS_IOC_ZERO_RANGE’ undeclared (first use in this function)
- c# XML和实体类之间相互转换(序列化和反序列化)