发现自己以前对数位DP其实一窍不通...

这题可以做一个很简单的转换:一个数如果在$b$进制下是一个01串,且1的个数恰好有k个,那么这个数就是合法的(刚开始没判断必定是01串,只判断了1的个数竟然有60pts,数据可真的水~)

这个结论显然成立,也不需要什么证明啦qaq~

然后数位DP就好了

转化为b进制后要么插1要么插0,$dp[x][cnt]$表示当前处理到第i为,已经有cnt个1的情况下

转移方程:

$$dp[x][cnt]=\sum dp[x-1][cnt+1](当前位为1)$$

$$dp[x][cnt]=\sum dp[x-1][cnt](当前位为0)$$

记忆化搜索就好了

 #include<bits/stdc++.h>
#define writeln(x) write(x),puts("")
#define writep(x) write(x),putchar(' ')
using namespace std;
inline int read(){
int ans=,f=;char chr=getchar();
while(!isdigit(chr)){if(chr=='-') f=-;chr=getchar();}
while(isdigit(chr)){ans=(ans<<)+(ans<<)+chr-;chr=getchar();}
return ans*f;
}void write(int x){
if(x<) putchar('-'),x=-x;
if(x>) write(x/);
putchar(x%+'');
}const int M = ;
int dp[M][M],a[M],tp,l,r,x,y,k,b;
int dfs(int x,int cnt,int lim){
if(cnt>k)return ;
if(x==)return cnt==k;
if(!lim&&dp[x][cnt]!=-)return dp[x][cnt];
int ans=,up=b-;
if(lim)up=a[x];
for(int i=;i<=up;i++){
if(i==)ans+=dfs(x-,cnt+,lim&&(a[x]==i));
else if(!i)ans+=dfs(x-,cnt,lim&&(a[x]==i));
}
if(!lim)dp[x][cnt]=ans;
return ans;
}
inline int Solve(int x){
int tp=;
while(x){a[++tp]=x%b;x/=b;}
return dfs(tp,,);
}
int main(){
memset(dp,-,sizeof(dp));
l=read(),r=read(),k=read(),b=read();
l=Solve(l-);r=Solve(r);
writeln(r-l);
return ;
}

【数位DP】[LOJ10163]Amount of Degrees的更多相关文章

  1. LOJ10163 Amount of Degrees

    题目描述 求给定区间 [X,Y] 中满足下列条件的整数个数:这个数恰好等于 KK 个互不相等的 BB 的整数次幂之和.例如,设 X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足题意 输入格 ...

  2. 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 ...

  3. Ural1057. Amount of Degrees 题解 数位DP

    题目链接: (请自行百度进Ural然后查看题号为1057的那道题目囧~) 题目大意: Create a code to determine the amount of integers, lying ...

  4. Ural1057 - Amount of Degrees(数位DP)

    题目大意 求给定区间[X,Y]中满足下列条件的整数个数:这个数恰好等于K个互不相等的B的整数次幂之和.例如,设X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足题意: 输入:第一行包含两个整 ...

  5. 2018.09.07 Amount of degrees(数位dp)

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

  6. Ural Amount of Degrees(数位dp)

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

  7. [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 ...

  8. URAL1057. Amount of Degrees(DP)

    1057 简单的数位DP  刚开始全以2进制来算的 后来发现要找最接近x,y值的那个基于b进制的0,1组合 #include <iostream> #include<cstdio&g ...

  9. 数位dp总结

    由简单到稍微难点. 从网上搜了10到数位dp的题目,有几道还是很难想到的,前几道基本都是模板题,供入门用. 点开即可看题解. hdu3555 Bomb hdu3652 B-number hdu2089 ...

随机推荐

  1. NX二次开发-UFUN设置透明度UF_OBJ_set_translucency

    NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_obj.h> UF_initialize( ...

  2. mysql 第一次启动及常用命令

    启动 mysql -u root -p 进入后 # 显示有几个数据库 mysql> show databases; +--------------------+ | Database | +-- ...

  3. detours学习

    最近学习detours3.0,总结下学习过程,给后来学习者一点参考,也便于自己以后复习 首先应该知道detours可以干什么,学习之前最好看一下detours文档,这个文档很简单,只有4篇文章,相对比 ...

  4. Python3 From Zero——{最初的意识:005~文件和I/O}

    一.输出重定向到文件 >>> with open('/home/f/py_script/passwd', 'rt+') as f1: ... print('Hello Dog!', ...

  5. shell得到两个文件的差集

    第一种方法: grep: [root@hdp05 src]# grep -vxFf leadering.txt leaderNum.txt [root@hdp05 src]# cat leaderin ...

  6. 注意:字符串substring方法在jkd6,7,8中的差异。

    标题中的substring方法指的是字符串的substring(int beginIndex, int endIndex)方法,这个方法在jdk6,7是有差异的. substring有什么用? sub ...

  7. 学习修复Laravel The only supported ciphers are AES-128-CBC and AES-256-CBC

    The only supported ciphers are AES-128-CBC and AES-256-CBC 在项目中,删除了 .env的APP_KEY的值,再运行 php artisan k ...

  8. css---7自定义字体

    1.Adobe illustrator AI是一种应用于出版.多媒体和在线图像的工业标准矢量插画的软件,是一款非常好的矢量图形处理工具. 该软件主要应用于印刷出版.海报书籍排版.专业插画.多媒体图像处 ...

  9. 日志框架一logback配置和使用

    把logback或者log4j放在src/main/resources下,Spring容器就可以自动加载日志文件. 前言 Logback是由log4j创始人设计的又一个开源日志组件, 比log4j的性 ...

  10. Jmeter接口自动化测试:简单使用步骤

    好处:不需要页面就可以提前介入测试,实施成本低,修改量少,相对于UI自动化来说更为稳定 1. 下载略过 2. 使用步骤 创建线程组合控制器(Jmeter基本操作) 针对http协议的接口增加Sampl ...