【hdu3555】Bomb 数位dp
题目描述
求 1~N 内包含数位串 “49” 的数的个数。
输入
The first line of input consists of an integer T (1 <= T <= 10000), indicating the number of test cases. For each test case, there will be an integer N (1 <= N <= 2^63-1) as the description.
The input terminates by end of file marker.
输出
For each test case, output an integer indicating the final points of the power.
样例输入
3
1
50
500
样例输出
0
1
15
题解
数位dp
设 $f[i][j][0/1]$ 表示 $i$ 位数,最高位为 $j$ ,是否包含数位串 “49” 的数的个数。
首先预处理出 $f$ 数组,根据是否以前有“49”或能构成“49”来更新新的 $f$ 值。
然后对于每个询问跑数位dp:先计算位数不满 $n$ 的位数的数的答案,然后从高位到低位计算,统计该位小于该数当前位的的数,相等的位考虑下一位。
注意统计当前位时需要同时考虑前面是否有“49”,两个数位能否拼成“49”,后面是否有“49”。然而本题数字串的第二位是“9”,枚举时枚举不到9,因此不需要考虑前后两个数位拼成“49”的情况。
把询问转化为 $[1,n)$ 的区间会更容易些。
代码中为了避免一些细节(比如 $10^{19}$ 爆long long之类的),使用了unsigned long long。
#include <cstdio>
typedef unsigned long long ull;
ull f[20][10][2] , b[20];
void init()
{
int i , j , k , l;
f[0][0][0] = b[0] = 1;
for(i = 1 ; i < 20 ; i ++ )
{
b[i] = b[i - 1] * 10;
for(j = 0 ; j < 10 ; j ++ )
for(k = 0 ; k < 10 ; k ++ )
for(l = 0 ; l < 2 ; l ++ )
f[i][j][l || (j == 4 && k == 9)] += f[i - 1][k][l];
}
}
ull calc(ull n)
{
int i , j , di = 1 , flag = 0 , last = 0 , now;
ull ans = 0;
for(i = 1 ; b[i] <= n ; i ++ )
for(j = 1 ; j < 10 ; j ++ )
ans += f[i][j][1];
for( ; i ; i -- )
{
now = n / b[i - 1] % 10;
for(j = di ; j < now ; j ++ )
ans += f[i][j][1] + f[i][j][0] * flag;
if(last == 4 && now == 9) flag = 1;
di = 0 , last = now;
}
return ans;
}
int main()
{
init();
int T;
ull n;
scanf("%d" , &T);
while(T -- ) scanf("%llu" , &n) , printf("%llu\n" , calc(n + 1));
return 0;
}
【hdu3555】Bomb 数位dp的更多相关文章
- hdu---(3555)Bomb(数位dp(入门))
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submi ...
- HDU3555 Bomb —— 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) M ...
- hdu3555 Bomb(数位dp)
题目传送门 Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total ...
- hdu3555 Bomb 数位DP入门
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 简单的数位DP入门题目 思路和hdu2089基本一样 直接贴代码了,代码里有详细的注释 代码: ...
- HDU3555 Bomb[数位DP]
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submi ...
- HDU3555 Bomb 数位DP第一题
The counter-terrorists found a time bomb in the dust. But this time the terrorists improve on the ti ...
- hdu3555 Bomb (数位dp入门题)
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submi ...
- HDU 3555 Bomb 数位dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Mem ...
- hud 3555 Bomb 数位dp
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Subm ...
随机推荐
- Python之数据处理
一.CSV数据处理 CSV文件格式:逗号分隔值(Comma-Separated Value,CSV,有时也称为字符分隔值,因为分隔符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本).纯文 ...
- 10、Java并发编程:并发容器之ConcurrentHashMap
Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concu ...
- springBoot 中webSocket 应用一
<html> <head> <meta charset="UTF-8"> <title>websocket测试</title& ...
- Drupal 判断匿名用户必须先登录的解决方法
要实现如果是匿名用户点击checkout链接,要求先登录 方案一.通过添加Rules规则实现 EVENT:After adding a product to the cart Conditions : ...
- 四、新时间日期API
一.使用 LocalDate .LocalTime .LocalDateTime LocalDate.LocalTime.LocalDateTime 类的实例是不可变的对象,分别表示使用 ISO-86 ...
- iTextSharp动态生成多页pdf及追加内容等记录
1.要动态生成pdf,无非是用第三方或直接代码生成. 2.iTextSharp生成pdf问题点记录 dll相关下载 https://files.cnblogs.com/files/xlgwr/iTex ...
- uvaoj1586Molar mass(暴力)
An organic compound is any member of a large class of chemicalcompounds whose molecules contain carb ...
- Soliworks 2016建模细节总结(1)
Soliworks 2016建模小细节总结(1) 1.Solidworks 2016三维建模的时候,如果想要在一个视图里面呈现出四个视图(包括三个独立的视图以及三维结构的实体模型图),可以直接按鼠标会 ...
- mysql bin log配置及查看
mysql执行sql可以通过设置mysql bin 日志进行记录查看 mysql bin日志配置如下: log_bin:on log_bin_basename:bin文件路径及名前缀(/var ...
- Django学习总结②----关系运算与F,Q关系
关联mysql步骤: 第一步:下载pymysql:pip install pymysql 第二步:在工程目录下的init文件下,将pymysql引入 import pymysql pymysql.in ...