/*
题意:求出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. 1、IO概述及File类

  2. css靠左,靠右

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. mysql之通过cmd连接远程数据库

    ---恢复内容开始--- 目录 前提 连接远程数据库 前提: 本地安装了mysql数据库 本地和远程网络是连通的,通过命令ping ip (即ping 192.168.0.333),可以ping通 连 ...

  4. 百度地图对https的支持

    在使用百度地图时,如果直接使用其提供的js地址,在通过https的方式请求时,是不支持的 <script type="text/javascript" src="h ...

  5. git push失败the remote end hung up unexpectedly

    Git Push是老是失败,提示: fatal: the remote end hung up unexpectedly git did not exit cleanly (exit code 1) ...

  6. Vue 路由知识三(过渡动画及路由钩子函数)

    路由的过渡动画:让路由有过渡动画,需要在<router-view>标签的外部添加<transition>标签,标签还需要一个name属性. <transition nam ...

  7. node.js入门之二

    NPM 1.NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM ...

  8. H5 canvas 之乱画

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. vim 将文件所有行合并到一行

      vim 将文件所有行合并到一行   在 Normal Mode下执行: ggvGJ gg 用于跳到行首 v 转换成 visual 模式 G 跳到最后一行 J 合并行

  10. 经常遇到的js兼容问题大总结----最全总结

    001.获取滚动条滚动的距离 var sTop = document.documentElement.scrollTop || document.body.scrollTop 002.获取非行间样式 ...