hdu 3555 Bomb 炸弹(数位DP,入门)
题意:
给一个数字n,求从1~n中有多少个数是含有49的,比如49,149,1490等都是含49的。
思路:
2^64也顶多是十进制的20多位,那么按十进制位来分析更简单。如果能计算k位十进制数中分别有多少个含49的,那么计算就简单了。
首先要求关于十进制位的一些信息,比如:i位的十进制数包含49有多少个,不包含49的多少个(除掉最高位是9的数量),不包含49但是最高位是9的有多少个(因为可能和更高一位组合成49)。注意精度,注意爆longlong。
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N=;
LL dp[N][];
int s[]; void init()
{
dp[][]=;
for(int i=; i<N; i++)
{
dp[i][]=dp[i-][]*-dp[i-][]; //dp[i][0]代表长度为 i 并且不含有49的数字的个数;
dp[i][]=dp[i-][]; //dp[i][1]代表长度为 i 并且不含有49,但是最高位是9的数字的个数;
dp[i][]=dp[i-][]+dp[i-][]*; //dp[i][2]代表长度为 i 并且含有49的数字的个数。
}
} int main()
{
init();
freopen("input.txt", "r", stdin);
LL t, n;
cin>>t;
while(t--)
{
memset(s,,sizeof(s));
scanf("%lld",&n);
int cnt=;
n++; //个位上必须大出1,方便计算出现紧挨着的49的情况。
while(n)
{
s[++cnt]=n%; //逐位提取出来
n/=;
}
LL ans=;
int last=, flag=;
for(int i=cnt; i>; i--) //具体就是要分析什么情况下会出现49,而且不能计算重复。
{
ans+=s[i]*dp[i-][]; if(flag) ans+=dp[i-][]*s[i]; //之前出现过紧挨着的49,那么第i位所可能出现的0~s[i]-1都与dp[i-1][0]个构成符合条件的数。 if(!flag&&s[i]>) ans+=dp[i-][]; //s[i]大于4的情况,如果flag为true,那么都会在之前的紧挨49之后的那一步被统计掉。 if(last==&&s[i]==) flag=true; //一旦flag开启,一直开启。目的是为了计算上限。 last=s[i];
}
cout<<ans<<endl;
}
return ;
}
AC代码
通用的解法。
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <algorithm>
#include <vector>
#include <iostream>
#define pii pair<int,int>
#define INF 0x7f3f3f3f
#define LL long long
#define ULL unsigned long long
using namespace std;
const double PI = acos(-1.0);
const int N=; ULL dp[N][];
int bit[N]; void pre_cal()
{
dp[][]=;
for(int i=; i<=; i++ ) //计算不含49的
{
dp[i][]=*dp[i-][]-dp[i-][];
dp[i][]=dp[i-][]; //以9开头
}
} ULL cal(ULL n) //计算区间[0~n]吉利的数量
{
int len=, i;
ULL big=n;
while(n)
{
bit[++len]=n%;
n/=;
}
bit[len+]=;
ULL ans=;
for(i=len ;i>; i--)
{
ans+=dp[i-][]*bit[i];
if(bit[i]>) ans-=dp[i-][];
if(bit[i+]==&&bit[i]==) break;
}
if(i==) ans++; //n本身是否吉利?
return big-ans+;
} int main()
{
//freopen("input.txt","r",stdin);
pre_cal();
int t;cin>>t;
ULL s;
while(t--)
{
scanf("%lld",&s);
printf("%llu\n",cal(s));
}
return ;
}
AC代码
hdu 3555 Bomb 炸弹(数位DP,入门)的更多相关文章
- hdu 3555 Bomb(数位dp入门)
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Subm ...
- HDU 3555 Bomb(数位DP模板啊两种形式)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 Problem Description The counter-terrorists found ...
- HDU 3555 Bomb(数位DP)
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Subm ...
- 动态规划晋级——HDU 3555 Bomb【数位DP详解】
转载请注明出处:http://blog.csdn.net/a1dark 分析:初学数位DP完全搞不懂.很多时候都是自己花大量时间去找规律.记得上次网络赛有道数位DP.硬是找规律给A了.那时候完全不知数 ...
- HDU 3555 Bomb (数位DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 题目大意:从0开始到给定的数字N所有的数字中遇到“49”的数字的个数. Sample Input ...
- hdu 3555 Bomb 【数位DP】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 题意:上一题是不要62 这个是"不要49" 代码: #include < ...
- hdu 3555 Bomb ( 数位DP)
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Subm ...
- HDU 2089 - 不要62 - [数位DP][入门题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...
- Hdu 2089 不要62 (数位dp入门题目)
题目链接: Hdu 2089 不要62 题目描述: 给一个区间 [L, R] ,问区间内不含有4和62的数字有多少个? 解题思路: 以前也做过这个题目,但是空间复杂度是n.如果数据范围太大就GG了.今 ...
- hdu 4722 Good Numbers( 数位dp入门)
Good Numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
随机推荐
- view-source协议
转自;https://blog.csdn.net/yuwq123/article/details/79481829
- JSONObject put List<Double> 后转化为String问题的解决办法
//原代码 JSONObject powerCurveJsonObj = new JSONObject(); powerCurveJsonObj.put("test",[0.5, ...
- web开发菜鸟应该如何向前端大神提问题(一次性把问题描述清楚)
1. 问题的环境和背景这里的背景一般包括,是针对桌面浏览器还是移动端开发?如果是桌面浏览器,则兼容性要求如何?比方说,你来咨询父级是百分比高度的垂直居中效果,你就要说明,你这个效果是需要兼容IE7+还 ...
- POJ3268【最短路】
题意: n个点m条有向边,每个点有一头牛,每头牛会沿着各自的最短路先到x点,然后又从x点到各自的点,求这些牛中间最短路程最大的牛. 思路: 从x点到各点的最短路不用说了,裸的最短路: 但是从所有点到x ...
- grunt和seajs入门之--提取依赖、合并、压缩js文件
一.安装grunt: npm install -g grunt-cli //安装 npm install grunt –save-dev //安装Grunt最新版本到项目目录中,并将其添加到devDe ...
- 详解Codis安装与部署
Codis github上的介绍安装,里面很全,而且也有中/英文的,只不过按照github的步骤安装,会有一些坑,所以有了这么一篇文章. 在上一篇文章<Redis实用监控工具一览>中,介绍 ...
- 【NOIP模拟】序列
[问题描述] 一个序列被称为有趣的序列是它的所有的子串拥有一个唯一的整数(这个整数在整个序列中只出现过一次).给你一个序列的整数, 问你它是否是有趣的. [输入格式] 第一行 T, 表示数据组数.接下 ...
- Spring事件机制详解
一.前言 说来惭愧,对应Spring事件机制之前只知道实现 ApplicationListener 接口,就可以基于Spring自带的事件做一些事情(如ContextRefreshedEvent),但 ...
- MyBatist庖丁解牛(五)
很多时候我们在自己的每个service中没有中注入SqlSessionTemplate; 但是我们直接调用mapper接口方法就直接能够操作数据库 这个是为什么??下面开始解惑: Mybatis Sq ...
- DB2 - 编目的解释
编目(Catalog),是在本地或远程建立客户端到服务器的数据库连接的过程.其目的在于获取编目信息,即生成用来访问数据库的目录.系统数据库目录包含一个列表和指针,通过目录可以使 DB2 能够找到已知的 ...