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 ...
随机推荐
- Word2013 在一个页面双列显示
1. 效果图 2. 实现方法 (1) 进入页面布局 (2) 选中要整理的字,选中Columns,然后选择Two
- OS__信号量(semaphore)PV操作
信号量的概念 1.信号量的类型定义 信号量(semaphore)的数据结构为记录型数据结构一个值和一个指针,指针指向等待该信号量的下一个进程.信号量的值与相应资源的使用情况有关,在操作系统中,信号量用 ...
- 关于chrome被篡改主页修复方法
打开chrome的属性. 在目标框中追加以下内容 "PATH\chrome.exe" --flag-switches-begin --flag-switches-end about ...
- 2-2和2-3基本数据类型 & 2-4基本数据类型详解 & 3-1和3-2整形字面量值及变量声
2-4基本数据类型详解 3-1和3-2整形字面量值及变量声 023是八进制的 0x1357是十六进制 0X3C也是十六进制 0x1abL:长整型 变量声明 数据类型 空格 变量名 赋值: 变量的定义:
- Eclipse SVN 图标解释
[转]http://blog.sina.com.cn/s/blog_64941c8101018dno.html - 已忽略版本控制的文件.可以通过Window → Preferences → Team ...
- 微信小程序中时间戳和日期的相互转换
在微信开发小程序时,后台传入的诗句可能是 时间戳 而不是日期 或者需要把日期转换成时间戳来做出相应的处理时我们将用到时间戳和日期的相互转换微信小程序里, 时间戳转化为日期格式,支持自定义.拷贝至项目 ...
- PhpStorm之配置数据库连接
打开编辑器,找到编辑器右侧的 Database 点击 Database,点击左上角的 + ,选择Data Source ,再点击需要连接的数据库类型(因为我的数据库是MySQL,所以使用MySQL数据 ...
- 兼容主流浏览器的渐变颜色背景gradient的写法
/* Webkit: Safari 4-5, Chrome 1-9 */ background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff66 ...
- 茅台【思维/数学/剪枝】By cellur925
题目传送门 给你\(n\)根木棍,问有多少种方法,使得选出的三根木棍能组成三角形. 开始想要用搜索的,但是写着写着卡壳了(?),于是改用贪心,开始对拍,觉得很稳,只是最后两个数据可能有点卡.很第一题难 ...
- android intent安装apk
/** * 安装apk * * @param context * @param apkPath */ public static void installApk(Context context, St ...