[数字dp] hdu 3271 SNIBB
意甲冠军:有两个查询:
q=1。在[x,y]间隔,兑换b十进制,数字和m多少个月。
q=2。在[x,y]间隔,兑换b十进制,数字是m第一k的数目是多少(十进制),没有输出由给定的主题。
思维:
和比特的平均数dp如,第几个数的话就是二分推断。
然后就是按常理要开4维,就是dp[i][sum][b][m] i位,和为sum,b进制,最后和为m
可是开不下,所以开3维每次初始化。
注意一下:
1、每次都要初始化
2、x不一定小于y
3、是[x,y]不是(x,y]
代码:
#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"stack"
#include"algorithm"
#include"iostream"
using namespace std;
__int64 dp[33][320][65],num[33]; // i位 和是sum 进制b 的关于m的答案 可是再替m开一维开不下。所以不能在外面初始化
__int64 dfs(__int64 site,__int64 sum,__int64 b,int f,__int64 m)
{
if(site==0) return sum==m?1:0;
if(!f&&dp[site][sum][b]!=-1) return dp[site][sum][b];
__int64 len=f? num[site]:b-1;
__int64 ans=0;
for(__int64 i=0; i<=len; i++)
{
ans+=dfs(site-1,sum+i,b,f&&i==len,m);
}
if(!f) dp[site][sum][b]=ans;
return ans;
}
__int64 solve(__int64 x,__int64 b,__int64 m)
{
int cnt=0;
if(x<0) return 0;
while(x)
{
num[++cnt]=x%b;
x/=b;
}
return dfs(cnt,0,b,1,m);
}
int main()
{
int cas=1;
int q;
while(scanf("%d",&q)!=-1)
{
__int64 x,y,b,m,k;
memset(dp,-1,sizeof(dp)); //必须放里面
printf("Case %d:\n",cas++);
if(q==1)
{
scanf("%I64d%I64d%I64d%I64d",&x,&y,&b,&m);
if(x>y) swap(x,y);
printf("%I64d\n",solve(y,b,m)-solve(x-1,b,m));
}
else
{
scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&b,&m,&k);
x--; //注意这里是求 [x,y]区间内的! if(x>y) swap(x,y);
__int64 ans=-1,s;
s=solve(x,b,m);
s+=k;
__int64 l=x+1,r=y;
while(l<=r)
{
__int64 mid=(l+r)/2;
if(solve(mid,b,m)>=s)
{
ans=mid;
r=mid-1;
}
else l=mid+1;
}
if(ans!=-1) printf("%I64d\n",ans);
else puts("Could not find the Number!");
}
}
return 0;
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
[数字dp] hdu 3271 SNIBB的更多相关文章
- hdu 3271 SNIBB 数位DP+二分
思路:dp[i][j]:表示第i位在B进制下数字和. 用二分找第k个数! 代码如下: #include<iostream> #include<stdio.h> #include ...
- HDU 3271 SNIBB
SNIBB Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 3271 ...
- [数字dp] hdu 3565 Bi-peak Number
意甲冠军: 为了范围[X,Y],的最大位数的范围内的需求高峰和值多少. 双峰是为了满足一些规定数量 你可以切两 /\ /\ 形式. 思维: dp[site][cur][ok] site地点 面的数 ...
- HDU - 4734 F(x) (2013成都网络游戏,数字DP)
意甲冠军:求0-B见面<=F[A]所有可能的 思维:数字DP,内存搜索 #include <iostream> #include <cstring> #include & ...
- fwt优化+树形DP HDU 5909
//fwt优化+树形DP HDU 5909 //见官方题解 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ #include <bits/ ...
- hdu 3652 B-number(数字dp)
http://acm.hdu.edu.cn/showproblem.php? pid=3652 大致题意:"B-number"即一个整数含有子串"13"且被13 ...
- hdu 3709 数字dp(小思)
http://acm.hdu.edu.cn/showproblem.php?pid=3709 Problem Description A balanced number is a non-negati ...
- HDU——B-number(数字DP)
标题效果: 要了解1至n如何号码之间有许多含有13,并13可分 记忆化搜索: dp[pos][pre][mod][statu],pos位数,pre前一位,mod余数,statu状态 有2个状态:含13 ...
- HDU 3271 数位dp+二分
SNIBB Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
随机推荐
- ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍
如果我是C罗 原文 ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍 sequence在ORACLE中应用十分广泛,就是序列号的意思,会自动增加指定变数,如逐次增加1或者2或者 ...
- ios开发零散知识点总结
1:当有导航栏的时候,子视图为UIScrollView,或是继承于UIScrollView的控件如UITableView,UICollectionView等,控制器会自动调用 self.automat ...
- php-post模拟登录,同步登录(摘自网络)
这也是个老生常谈的话题了,上午花了点时间把这个问题整理了一下. 一般来说用PHP来模拟post提交数据有三种方法,file_get_contents.curl和socket. 写了个公用函数,专门用来 ...
- 【54.08%】【BZOJ 1941】Hide and Seek
Time Limit: 16 Sec Memory Limit: 162 MB Submit: 919 Solved: 497 [Submit][Status][Discuss] Descript ...
- hadoop集群安装(多机,非伪集群)
1. 创建用户 创建hadoop用户组:sudo addgroup hadoop 创建hadoop用户:sudo adduser -ingroup hadoop hadoop 为hadoop用户分配r ...
- Matlab图像处理系列4———图像傅立叶变换与反变换
注:本系列来自于图像处理课程实验.用Matlab实现最主要的图像处理算法 1.Fourier变换 (1)频域增强 除了在空间域内能够加工处理图像以外.我们还能够将图像变换到其它空间后进行处理.这些方法 ...
- OK6410开发板系统安装---嵌入式回归第二篇
1. 嵌入式系统须要被安装到开发板的nandflash上 或者 SD卡上 2. 须要安装的嵌入式Linux系统能够分三个部分 watermark/2/text/aHR0cDovL2Jsb2cuY3Nk ...
- 忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(7)结构体
一.为什么需要结构体? 为了表示一些复杂的事物,而普通类型无法满足实际需求 二.什么叫结构体? 把一些基本类型组合在一起形成的一个新的复合数据类型叫做结构体. 三.如何定义一个结构体? 第一种方式: ...
- HashTable 解决碰撞(冲突)的方法 —— 分离链接法(separate chaining)
1. ListNode 及 HashTable 的类型声明 声明 typedef int ElementType; typedef unsigned int Index; struct ListNod ...
- 【codeforces 546B】Soldier and Badges
time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...