Description

问[L,R]中有多少能表示k个b次幂之和.

Sol

数位DP.

当2进制时.

建出一个二叉树, \(f[i][j]\) 表示长度为 \(i\) 有 \(j\) 个1的个数.

递推式就是左右子树之和 \(f[i][j]=f[i-1][j-1]+f[i-1][j]\)

将b进制变成2进制来做.

因为发现系数只能是1,所以找到一个b进制下极大的2进制就行..我觉得我好像讲不明白..

我计算的是小于 x 满足条件的...我觉得这样比较好写,也不用特判最后的情况..

复杂度 \(O(log^2 n)\)

Code

#include <cstdio>
#include <iostream>
using namespace std; #define debug(a) cout<<#a<<"="<<a<<" "
const int N = 64;
typedef long long LL; LL l,r,k,b;
LL f[N][N]; void init() {
f[0][0]=1;
for(int i=1;i<32;i++) {
f[i][0]=1;
for(int j=1;j<=i;j++) f[i][j]=f[i-1][j]+f[i-1][j-1];
}
// for(int i=0;i<6;i++) {
// for(int j=0;j<=i;j++) cout<<f[i][j]<<" ";cout<<endl;
// }
}
LL calc(LL x) {
LL t=1,r=0,c=0;
for(;t<x;t*=b,c++);
for(;x;t/=b,c--) if(x>=t) {
if(x>=2*t) {
return r+(1<<(c+1))-1;
}else {
x%=t,r+=1<<c;
}
}
return r;
}
int DP(LL x) {
int r=0,c=k;
for(int i=31;~i;i--) {
if(x & (1LL<<i)) {
if(c>=0) r+=f[i][c];
c--;
// debug(i),debug(f[i][c])<<endl;
}
}return r;
}
int main() {
// freopen("in.in","r",stdin);
init(); cin>>l>>r>>k>>b; // debug(calc(r)),debug(calc(l-1))<<endl;
// debug(DP(calc(r))),debug(DP(calc(l-1)))<<endl; cout<<DP(calc(r+1))-DP(calc(l))<<endl;
return 0;
}

  

Ural 1057 Amount of Degrees的更多相关文章

  1. [ACM] ural 1057 Amount of degrees (数位统计)

    1057. Amount of Degrees Time limit: 1.0 second Memory limit: 64 MB Create a code to determine the am ...

  2. URAL 1057 Amount of Degrees (数位dp)

    Create a code to determine the amount of integers, lying in the set [X;Y] and being a sum of exactly ...

  3. URAL 1057. Amount of Degrees(数位DP)

    题目链接 我看错题了...都是泪啊,不存在3*4^2这种情况...系数必须为1... #include <cstdio> #include <cstring> #include ...

  4. ural 1057 Amount of degrees 【数位dp】

    题意:求(x--y)区间转化为 c 进制 1 的个数为 k 的数的出现次数. 分析:发现其满足区间减法,所以能够求直接求0---x 的转化为 c 进制中 1 的个数为k的数的出现次数. 首先用一个数组 ...

  5. URAL 1057 Amount of Degrees (数位DP,入门)

    题意: 求给定区间[X,Y]中满足下列条件的整数个数:这个数恰好等于K个互不相等的,B的整数次幂之和.例如,设X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足了要求:  17 = 24+2 ...

  6. Timus Online Judge 1057. Amount of Degrees(数位dp)

    1057. Amount of Degrees Time limit: 1.0 second Memory limit: 64 MB Create a code to determine the am ...

  7. 【Ural】【1057】Amount of degrees

    数位DP 2009年刘聪<浅谈数位类统计问题> 例题一 从组合数 以及 数位DP的角度都可以做…… 首先转化成求1~n内K进制下只有0.1的数的个数: 考虑K进制下第一个为1的位,剩下的数 ...

  8. Ural Amount of Degrees(数位dp)

    传送门 Amount of Degrees Time limit: 1.0 secondMemory limit: 64 MB Description Create a code to determi ...

  9. 一本通1585【例 1】Amount of Degrees

    1585: [例 1]Amount of Degrees 时间限制: 1000 ms         内存限制: 524288 KB 题目描述 原题来自:NEERC 2000 Central Subr ...

随机推荐

  1. Mac下打开eclipse 始终提示 你需要安装Java SE 6 Runtime

    Mac下打开eclipse 始终提示 你需要安装Java SE 6 Runtime        周银辉 我的mac os 版本是10.9.2,  JDK配置得好好的,但打开eclipse时还是提示需 ...

  2. 关于SIGSEGV错误及处理方法(转)

    转自:http://blog.csdn.net/brace/article/details/1102422   今天编程遇到了SIGSEGV错误,比较困惑,所以找了些资料,总结一下: (1)官方说法是 ...

  3. Android View 事件分发机制 源码解析 (上)

    一直想写事件分发机制的文章,不管咋样,也得自己研究下事件分发的源码,写出心得~ 首先我们先写个简单的例子来测试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个My ...

  4. React Native 接入微博、微信、QQ 登录功能

    在 App 开发中我们经常需要在用户登录模块接入 SNS 登录组件,这样会大大提高用户的注册体验.特别当一个不是刚性需求 App 推广的时候,这样会很大的降低用户体验的成本,没有人愿意忍受输入邮箱.手 ...

  5. JQuery对id中含有特殊字符的转义处理

    转载--http://www.jb51.net/article/41192.htm <div id="a[]">kkkkkk</div> <scrip ...

  6. python-实现生产者消费者模型

    生产者消费者:包子铺不停的做包子,行人不停的买 ---> 这样就达到了目的--->包子的销售 两个不同的角色 包子铺,行人 只负责单一操作 让包子变成连接的介质. #_*_coding:u ...

  7. Centos7安装Mono(以4.6.0)为例

    本文记录mono安装的必须步骤,由于只是一个记录因此操作系统及mono版本都以当前环境为准. 1:环境依赖 操作系统为CentOS7.0,先安装mono依赖的各种组件: yum -y install ...

  8. 使用matlab进行空间拟合

    假设有这么一组数据, x=[4 5 6 7 8 4 8 10]'; y=[56 56 56 56 56 60 60 60]';z=[6 6 6 9 6 19 6 6]'; 要求出其平面方程z=C+Ax ...

  9. Python 从零学起(纯基础) 笔记 之 深浅拷贝

    深浅拷贝 1. import  copy#浅拷贝copy.copy()#深拷贝copy.deepcopy()#赋值 = 2.   对于数字和字符串而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个 ...

  10. Python 面向对象 基础

    编程范式概述:面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现 ...