挺正常的一道模板题。

  f[i][j][k]表示i位的数,有j个4,k个7的方案数。

  具体实现的话...我写了发二分答案。。需要注意的是二分时应该是mid=L+(R-L)/2。。不然分分钟爆longlong(unsigned long long党自行退散

  其实也可以从左端点开始慢慢爬。。。但总觉得比较蛋疼所以没敢写

  由网上题解可得,其实还可以确定答案的位数后,从高位往低位一个一个试= =...复杂度会比二分答案的少个log

  需要注意一下对0的特判。。

  对于从左端点爬到根再爬到右端点的奇怪姿势一直不敢碰。。药丸的节奏啊= =。。GDOI应该不会出这么sxbk的东西吧(手动立flag?

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
struct poi{
ll k;int id;
}q[];ll ans[];
ll f[][][],ten[];bool u[][][];
int i,j,x,y,X,Y,num;
ll l,r,tmp;
int s[],len; bool cmp(poi a,poi b){return a.k<b.k;}
inline ll get(ll x){
for(tmp=x,len=;tmp;tmp/=)s[++len]=tmp%;
if(!x)s[len=]=;
ll ans=;register int i,j;int sx=X,sy=Y;
if(X+Y>len)return ;
for(i=sx+sy;i<len;i++)
for(j=;j<=;j++)
if((sx||j!=)&&(sy||j!=))ans+=f[i-][sx-(j==)][sy-(j==)];
// printf(" %lld\n",ans);
for(i=;i<s[len];i++)
if((sx||i!=)&&(sy||i!=))ans+=f[len-][sx-(i==)][sy-(i==)];
sx-=s[len]==,sy-=s[len]==;
for(i=len-;i&&sx>=&&sy>=;i--){
for(j=;j<s[i];j++)
if((sx||j!=)&&(sy||j!=))ans+=f[i-][sx-(j==)][sy-(j==)];
sx-=s[i]==,sy-=s[i]==;
}
if(!sx&&!sy&&x)ans++;
// printf(" %lld\n",ans);
return ans+(!X&&!Y);
}
int main(){
f[][][]=f[][][]=;f[][][]=;f[][][]=;
for(i=ten[]=;i<=;i++)ten[i]=ten[i-]*;
for(i=;i<=;i++){
for(x=;x<=i;x++)for(y=i-x;y;y--)
f[i][x][y]=x<=y?(f[i-][x][y]*+f[i-][x-][y]+f[i-][x][y-]):f[i][y][x]
;// ,printf(" %d %d %d %lld\n",i,x,y,f[i][x][y]);
for(x=;x<=i;x++)f[i][x][]=f[i][][x]=f[i-][x-][]+f[i-][x][]*;
f[i][][]=f[i-][][]<<;
// if(i<=3)
// for(x=0;x<=i;x++)for(y=0;y<=i-x;y++)printf(" %d %d %d %lld\n",i,x,y,f[i][x][y]);
}
int T,TT;scanf("%d",&TT);
for(T=;T<=TT;T++){
scanf("%lld%lld%d%d",&l,&r,&X,&Y);scanf("%d",&num);
for(i=;i<=num;i++)scanf("%lld",&q[i].k),q[i].id=i; sort(q+,q++num,cmp);
ans[]=l;
ll lnum=get(l),mx=get(r)-lnum; // printf(" lnum:%lld mx:%lld\n",lnum,mx);
printf("Case #%d:\n",T);
for(i=;i<=num;i++){
ll L=ans[q[i-].id],R=r,mid;
if(q[i].k==q[i-].k){ans[q[i].id]=L;continue;}
if(q[i].k>mx){ans[q[i].id]=-;continue;}
while(L<R){
mid=L+((R-L)>>);//printf(" %lld %lld \n",L,R);
if(get(mid)>=q[i].k+lnum)R=mid;else L=mid+;
}//puts("");
ans[q[i].id]=L;
}
for(i=;i<=num;i++)
if(ans[i]==-)puts("Nya!");else printf("%lld\n",ans[i]);
}
return ;
}

  话说网上有些题解遇到极限数据会炸>_<。。

[hdu3943]K-th Nya Number的更多相关文章

  1. HDU 3943 K-th Nya Number

    K-th Nya Number Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on HDU. Origina ...

  2. HDU 3943 K-th Nya Number(数位DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3943 题目大意:求出区间 (P,Q] 中找到第K个满足条件的数,条件是该数包含X个4和Y个7 Samp ...

  3. ACM-ICPC 2018 沈阳赛区网络预赛-K:Supreme Number

    Supreme Number A prime number (or a prime) is a natural number greater than 11 that cannot be formed ...

  4. K - Queries for Number of Palindromes(区间dp+容斥)

    You've got a string s = s1s2... s|s| of length |s|, consisting of lowercase English letters. There a ...

  5. 【ACM-ICPC 2018 沈阳赛区网络预赛 K】Supreme Number

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然每个数字只可能是1,3,5,7 然后如果3,5,7这些数字出现两次以上.显然两个3||5||7都能被11整除. 然后1的话最多能 ...

  6. ACM-ICPC 2016 大连赛区现场赛 K. Guess the number && HDU 5981(思维+DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5981 题意:A在[L, R]之间随机选取一个数X,之后B来猜这个数,如果猜的数比X小,那么A就告诉B猜 ...

  7. 1. CountDiv 数数有几个 Compute number of integers divisible by k in range [a..b].

    package com.code; public class Test05_1 { public static int solution(int A, int B, int K) { // handl ...

  8. POJ2985 The k-th Largest Group[树状数组求第k大值+并查集||treap+并查集]

    The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8807   Accepted ...

  9. POJ 2985 The k-th Largest Group(树状数组 并查集/查找第k大的数)

    传送门 The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8690   Acce ...

随机推荐

  1. Struts2学习---result结果集

    这一章节主要介绍如何配置结果集,分为以下几个知识点: 结果集类型(result type) 全局结果集(global types) 动态结果集(dynamic type) 带有参数的结果集(type ...

  2. bzoj 3139: [Hnoi2013]比赛

    Description 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局,两支球队各得 ...

  3. windows net 命令(转载)

    CMD-NET命令详解 net命令大全,net命令用法,net网络命令,net命令使用,net命令集,net命令介绍,net常用命令,net命令的使用技巧,net命令如何使用 大家在操作Windows ...

  4. 2.Nginx日常维护技巧

    Nginx日常维护技巧 Nginx配置正确性检查 nginx提供了配置文件调试功能,可以快速定义配置文件存在的问题.执行如下命令检测配置文件的正确性: [root@localhost 桌面]# whi ...

  5. centOS7 mini配置linux服务器(五) 安装和配置tomcat和mysql

    配置java运行环境,少不了服务器这一块,而tomcat在服务器中占据了很大一部分份额,这里就简单记录下tomcat安装步骤. 下载 首先需要下载tomcat7的安装文件,地址如下: http://t ...

  6. C# 字符串的连接

    1.利用 "+"(加号)运算符: string str = "Hello"+ "World": console.WriteLine(str) ...

  7. HTML5图片上传本地预览

    在开发 H5 应用的时候碰到一个问题,应用只需要一张小的缩略图,而用户用手机上传的确是一张大图,手机摄像机拍的图片好几 M,这可要浪费很多流量. 我们可以通过以下方式来解决. 获取图片 通过 File ...

  8. python爬虫——写出最简单的网页爬虫

    在我们日常上网浏览网页的时候,经常会看到一些好看的图片,我们就希望把这些图片保存下载,或者用户用来做桌面壁纸,或者用来做设计的素材.我们可以通过python 来实现这样一个简单的爬虫功能,把我们想要的 ...

  9. eclipse常用快捷设置

    1.代码自动提示 在我们忘记方法名或者想偷懒时,代码自动提示很管用.不过Eclipse默认是输入"."后才会出现包或类成员的提示,也就意味着我们必须先输入一个完整的类名,提示才能出 ...

  10. ACSA Associate -- 01 Introduction To The Course

    1. 为什么要学习AWS认证? 2. AWS认证的考试是如何组织的? 3. 你需要做些什么? 4. 关于ACSA和ACSA BETA的信息 5. 其他链接 15 Top Paying IT Certi ...