/*
题意:求出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. easy ui combotree的操作

    1.获取combotree的选中值 $("#id").combotree("getValue"); 2.设置combotree的选中值 $('#id').com ...

  2. java之java.sql.SQLException: ResultSet is from UPDATE. No Data.

    问题解释:java调用存储过程的时候,查询结果不能通过ResultSet来查询,需要通过CallableStatement来查询, 比如: ResultSet rs = callableStateme ...

  3. poj3368 Frequent values

    思路: 转化为RMQ. 实现: #include <cstdio> #include <cstring> #include <algorithm> using na ...

  4. vue学习之遇见的问题

    1.本地图片加载不出来 错误原因:图片放置位置不对: 解决方法:需要将图片放在static文件夹里

  5. 重构31-Replace conditional with Polymorphism(多态代替条件)

    多态(Polymorphism)是面向对象编程的基本概念之一.在这里,是指在进行类型检查和执行某些类型操作时,最好将算法封装在类中,并且使用多态来对代码中的调用进行抽象. public class O ...

  6. iOS---数据离线缓存

    离线缓存 为了用户的体验,不需要每次打开App都加载新数据,或者重新请求数据,因此需要把每次浏览的数据保存起来,当下次打开软件时,首先从沙盒中加载数据:或者当软件未联网时,也只能从沙盒中加载旧数据. ...

  7. 解决VS2010警告unsuccessfulbuild”,因为已指定“AlwaysCreate”

    找到文件C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets: 定位到<Touch Alway ...

  8. elasticsearch学习笔记-倒排索引以及中文分词

    我们使用数据库的时候,如果查询条件太复杂,则会涉及到很多问题 1.无法维护,各种嵌套查询,各种复杂的查询,想要优化都无从下手 2.效率低下,一般语句复杂了之后,比如使用or,like %,,%查询之后 ...

  9. 洛谷 P2801 教主的魔法

    题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是 ...

  10. linux 10201 ASM RAC 安装+升级到10205

    准备环境的时 ,要4个对外IP,2个对内IP 不超过2T,,一般都用OCFS 高端存储适合用ASM linux10G安装的时候,安装的机器时间要小于等于(如果是等于要严格等于)第二个机器的时间(只有l ...