/*
题意:求出p-q的第j个nya数
数位dp,求出p-q的所有nya数的个数很好求,但是询问求出最终那个第j个值时是我不会求了看了下别人的思路
具体就是把p-q的第j个转化成0-q的第low+j个(其中low为小于等于p的nya数)
枚举q的每一位数字,枚举位数值并进行比较直至求出每一位的值。
经典好题,长见识了。
*/
#include<stdio.h>
#include<string.h>
#define ll __int64
#define N 21
ll dp[N][N][N][2],x,y,ans;//多开一个ok加快速度,把所有解全存起来
ll digit[N],flen;//flen吧最终q的长度保存起来
ll dfs(ll len,ll sin,ll qin,ll ok) {
if(!len) {
if(sin==x&&qin==y)return 1;
return 0;
}
if(sin>x||qin>y)return 0;
if(dp[len][sin][qin][ok]!=-1)
return dp[len][sin][qin][ok];
ll ans=0,maxx=ok?digit[len]:9,i;
for(i=0;i<=maxx;i++)
ans+=dfs(len-1,sin+(i==4),qin+(i==7),ok&&i==maxx);
dp[len][sin][qin][ok]=ans;//把所有情况保存起来
return ans;
}
ll f(ll n) {
ll len=0;
memset(dp,-1,sizeof(dp));
while(n) {
digit[++len]=n%10;
n/=10;
}
flen=len;//在询问时会用到
return dfs(len,0,0,1);
}
void dfs_answer(ll len,ll sin,ll qin,ll ok,ll kth) {//不断的递归调用自身直至求出最终结果
ll cnt,maxx=ok?digit[len]:9,i;
for(i=0;i<=maxx;i++) {
cnt=dfs(len-1,sin+(i==4),qin+(i==7),ok&&i==maxx);
if(cnt<kth)
kth-=cnt;
else
break;
}
ans=ans*10+i;//说明当第len个数是i时存在结果,求出的是第len位的值
if(len!=1)
dfs_answer(len-1,sin+(i==4),qin+(i==7),ok&&i==maxx,kth);//不断递归调用本身,顶多调用20次,每次的时间复杂度为0(1),因为每次调用dfs时的结果都已经保存起来了
}
int main() {
ll t,m,n,j,k,kk=0,q,low,high;
scanf("%I64d",&t);
while(t--) {
scanf("%I64d%I64d%I64d%I64d",&n,&m,&x,&y);
low=f(n);//求出0-n的nya数个数
high=f(m);//求出0-m的nya数个数
k=high-low;//n-m之间的个数
scanf("%I64d",&q);
printf("Case #%I64d:\n",++kk);
while(q--) {
scanf("%I64d",&j);
if(j>k)
printf("Nya!\n");
else {
ans=0;
j+=low;//计算0-m的第j个nya数
dfs_answer(flen,0,0,1,j);
printf("%I64d\n",ans);
}
}
}
return 0;}

hdu 3943 经典数位dp好题的更多相关文章

  1. 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题

    [HDU  3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...

  2. HDU 2089 不要62(数位dp模板题)

    http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求区间内不包含4和连续62的数的个数. 思路: 简单的数位dp模板题.给大家推荐一个好的讲解博客.h ...

  3. Bomb HDU - 3555 (数位DP)

    Bomb HDU - 3555 (数位DP) The counter-terrorists found a time bomb in the dust. But this time the terro ...

  4. HDU 2089 不要62 数位DP模板题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 参考博客:https://www.cnblogs.com/HDUjackyan/p/914215 ...

  5. HDU 2089 - 不要62 - [数位DP][入门题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...

  6. HDU - 3652 数位DP 套路题

    题意:统计能被13整除和含有13的数的个数 解法没法好说的..学了前面两道直接啪出来了 PS.HDU深夜日常维护,没法交题,拿网上的代码随便对拍一下,输出一致 #include<bits/std ...

  7. HDU 2089 不要62【数位DP入门题】

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. hdu 2089 不要62 (数位dp基础题)

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  9. HDU(4734),数位DP

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4734 F(x) Time Limit: 1000/500 MS (Java/Others) ...

随机推荐

  1. GUI初步和frame&panel

    java的话这个GUI其实不是什么重点,但我们也要学习,重点是学习这种图形编程的思路. java里面对于图形的一些类都封装在了AWT和它的一些子包里.AWT(抽象窗口开发包)            当 ...

  2. 在spring boot 中使用itext和itextrender生成pdf文件

    转载请注明出处 https://www.cnblogs.com/majianming/p/9539376.html 项目中需要对订单生成pdf文件,在第一版本其实已经有了比较满意的pdf文档,但是还是 ...

  3. Java实现三角形计数

    题: 解: 这道题考的是穷举的算法. 一开始看到这道题的时候,本能的想到用递归实现.但使用递归的话数据少没问题,数据多了之后会抛栈溢出的异常.我查了一下,原因是使用递归创建了太多的变量, 每个变量创建 ...

  4. 帮助新手理解equals和hashCode

    入行快要两年,偶尔想起来equals和hash还是会有些晕,索性今天就更深入的弄明白一些,不足之处也请各位大神指出批评,共同进步. 刚开始学java的时候只是记忆性的来背,如果一个类在程序中可能进行比 ...

  5. 微信小程序组件解读和分析:六、progress进度条

    progress进度条组件说明: 进度条,就是表示事情当前完成到什么地步了,可以让用户视觉上感知事情的执行.progress进度条是微信小程序的组件,和HTML5的进度条progress类似. pro ...

  6. js几个逻辑运算符的形象概括

    “&&”是逻辑与操作符,只有“&&”两边值同时满足(同时为真),整个表达式值才为真. b>a && b<c    //“&& ...

  7. vba,excel,身份证,照片

    Sub 插入图片() '调整单元格大小,以适应图片大小 功能 插入身份证照片打印 - 正面在单元格d6       反面单元格d10 ActiveSheet.Pictures.Delete '清理过期 ...

  8. Linux下 SpringBoot jar项目后台运行、查看、停用

    运行java jar: nohup java -jar **-0.0.1-SNAPSHOT.jar & 查看进程: 采用top或者ps aux命令.一般 如果后台是springboot,jar ...

  9. COPY - 在表和文件之间拷贝数据

    SYNOPSIS COPY tablename [ ( column [, ...] ) ] FROM { 'filename' | STDIN } [ [ WITH ] [ BINARY ] [ O ...

  10. asp.net的请求管道事件

    一.引言 上篇介绍了Http的请求过程提到了在请求进入到创建完 HttpApplication 对象后,将进入一系列的处理事件Event,那么这些事件具体都有哪些呢,这篇文章就来简要阐述一下. 二.正 ...