[hdu3943]K-th Nya Number
挺正常的一道模板题。
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的更多相关文章
- HDU 3943 K-th Nya Number
K-th Nya Number Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on HDU. Origina ...
- HDU 3943 K-th Nya Number(数位DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3943 题目大意:求出区间 (P,Q] 中找到第K个满足条件的数,条件是该数包含X个4和Y个7 Samp ...
- 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 ...
- 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 ...
- 【ACM-ICPC 2018 沈阳赛区网络预赛 K】Supreme Number
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然每个数字只可能是1,3,5,7 然后如果3,5,7这些数字出现两次以上.显然两个3||5||7都能被11整除. 然后1的话最多能 ...
- 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猜 ...
- 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 ...
- POJ2985 The k-th Largest Group[树状数组求第k大值+并查集||treap+并查集]
The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8807 Accepted ...
- POJ 2985 The k-th Largest Group(树状数组 并查集/查找第k大的数)
传送门 The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8690 Acce ...
随机推荐
- iOS SVN出现的问题,在mac使用Cornerstone中无法提交提交失败处理。。。
问题一: Description : An error occurred while contacting the repository. Suggestion : The server may be ...
- Effective Java 第三版——10. 重写equals方法时遵守通用约定
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- 读Zepto源码之assets模块
assets 模块是为解决 Safari 移动版加载图片过大过多时崩溃的问题.因为没有处理过这样的场景,所以这部分的代码解释不会太多,为了说明这个问题,我翻译了<How to work arou ...
- Netty-Websocket 根据URL路由,分发机制的实现
最近在做netty整合websocket,发现网上很多项目都是最简单的demo,单例的一个项目. 然而公司的项目需要接受几个不同功能的ws协议消息,因此最好是用URL来区分,让页面上采用不同的链接方式 ...
- Golang 网络爬虫框架gocolly/colly 三
Golang 网络爬虫框架gocolly/colly 三 熟悉了<Golang 网络爬虫框架gocolly/colly一>和<Golang 网络爬虫框架gocolly/colly二& ...
- java 学习(二)
public class Scoure { public static void main(String args[]) { int score=90; if (score>=85 && ...
- Linux的编码及编码转换
如果你需要在Linux中操作windows下的文件,那么你可能会经常遇到文件编码转换的问题.Windows中默认的文件格式是GBK(gb2312),而Linux一般都是UTF-8.下面介绍一下,在Li ...
- [编织消息框架][netty源码分析]12 ByteBuf 实现类UnpooledDirectByteBuf职责与实现
public class UnpooledDirectByteBuf extends AbstractReferenceCountedByteBuf { private final ByteBufAl ...
- 【原创】java NIO selector 学习笔记 一
能力有限,仅仅是自己看源码的一些笔记. 主要介绍 可选通道 和 选择器 选择键(SelectableChannel 和 Selector SelectionKey) 选择器(Selector) 选择 ...
- java log4j基本配置及日志级别配置详解
java log4j日志级别配置详解 1.1 前言 说出来真是丢脸,最近被公司派到客户公司面试外包开发岗位,本来准备了什么redis.rabbitMQ.SSM框架的相关面试题以及自己做过的一些项目回顾 ...