挺正常的一道模板题。

  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. Safari不能连接到服务器

    系统偏好设置-网络-高级-代理,把"网页代理"和"安全网页代理"两个复选项去掉,最下面"使用被动FTP模式"复选项保留,即可解决!

  2. bzoj 4539: [Hnoi2016]树

    Description 小A想做一棵很大的树,但是他手上的材料有限,只好用点小技巧了.开始,小A只有一棵结点数为N的树,结 点的编号为1,2,-,N,其中结点1为根:我们称这颗树为模板树.小A决定通过 ...

  3. 自建MySQL5.6数据库查询优化

    1.优化前查询速度 2.优化后查询速度 3.优化配置 innodb_buffer_pool_size=4Ginnodb_log_file_size=4Gmax_connections=1024inno ...

  4. 关于VS2017安装的一点扩充说明(15.5)

    其实逆天不推荐自己慢慢离线,找个离线包更新下再打包更快 Key:http://www.cnblogs.com/dunitian/p/4667038.html VS完整卸载工具:https://gith ...

  5. js写基础insertAfter()方法

    //DOM没有提供insertAfter()方法 function insertAfter(newElement, targetElement){ var parent = targetElement ...

  6. 进程管理工具htop/glances/dstat的使用

    进程管理工具htop/glances/dstat的使用 Linux中进程的相关知识 1.什么是进程呢? 通俗的来说进程是运行起来的程序.唯一标示进程的是进程描述符(PID). 2.进程的分类 1)根据 ...

  7. Jenkins 学习笔记(二):很简单的发布一次

    发布思路:从 github 拉取一些文件,然后推送到 Target server 的某个目录. 准备 1. Jenkins 需要安装的插件:『 Publish over SSH 』 2. 全局配置:系 ...

  8. Windows同时安装Python2、Python3兼容运行

    Python2.Python3可以同时安装在windows上,关键是如何有选择的运行Python2还是Python3.   指定运行版本 如果你有一个Python文件叫 hello.py,那么你可以这 ...

  9. BASIC-3 字母图形 循环 字符串

      基础练习 字母图形   时间限制:1.0s   内存限制:256.0MB        问题描述 利用字母可以组成一些美丽的图形,下面给出了一个例子: ABCDEFG BABCDEF CBABCD ...

  10. Python File flush方法应用

    # flush()使用# #!/usr/bin/python# # -*- coding: UTF-8 -*-## # 打开文件# fo = open("runoob.txt", ...