洛谷P2602 [ZJOI2010]数字计数(数位dp)
数字计数
解题思路
用\(dp[i][j][k]\)来表示长度为\(i\)且以\(j\)为开头的数里\(k\)出现的次数。
则转移方程式为:\(dp[i][j][k] += \sum_{t=0}^{9} dp[i - 1][t][k]\),即在每个数前面放一个\(j\),但是对于放在前面的这个\(j\)我们还没有计算进去,所以有:\(dp[i][j][j] += 10^{i-1}\)。注意此时计算的是有前导0的。
接下来见代码(其实是不知道怎么描述)。
代码如下
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
inline ll fpow(ll x, ll p){
ll ans = 1;
for(; p; p >>= 1, x = 1LL * x * x)if(p & 1)ans = 1LL * x * ans;
return ans;
}
ll dp[20][15][15];
void work(ll x, ll ans[])
{
ll num[15];
ll t = x;
int cnt = 0;
while(t){ //把每一位拆出来
num[++cnt] = t % 10;
t /= 10;
}
for(int i = 1; i < cnt; i ++) //小于cnt的位数全加上
for(int j = 1; j <= 9; j ++)
for(int k = 0; k <= 9; k ++)
ans[k] += dp[i][j][k];
for(int j = 1; j < num[cnt]; j ++) //相同位数小于最高位的全加上
for(int k = 0; k <= 9; k ++)
ans[k] += dp[cnt][j][k];
for(int i = cnt - 1; i >= 1; i --){ //遍历每一位
for(int j = 0; j < num[i]; j ++) //小于这位上数字的全加上
for(int k = 0; k <= 9; k ++)
ans[k] += dp[i][j][k];
for(int u = cnt; u > i; u --) //前面这几位都相等,出现了相同的次数
ans[num[u]] += num[i] * fpow(10LL, i - 1);
}
}
int main()
{
ll a, b;
scanf("%lld%lld", &a, &b);
for(int i = 1; i <= 12; i ++){
for(int j = 0; j <= 9; j ++){
for(int k = 0; k <= 9; k ++)
for(int t = 0; t <= 9; t ++)
dp[i][j][k] += dp[i - 1][t][k];
dp[i][j][j] += fpow(10LL, i - 1);
}
}
ll ans1[15] = {0};
ll ans2[15] = {0};
work(b + 1, ans1);
work(a, ans2);
for(int i = 0; i <= 9; i ++)
printf("%lld ", ans1[i] - ans2[i]);
return 0;
}
洛谷P2602 [ZJOI2010]数字计数(数位dp)的更多相关文章
- 洛谷P2602 [ZJOI2010]数字计数 题解 数位DP
题目链接:https://www.luogu.com.cn/problem/P2602 题目大意: 计算区间 \([L,R]\) 范围内 \(0 \sim 9\) 各出现了多少次? 解题思路: 使用 ...
- 洛谷 P2602 [ZJOI2010]数字计数
洛谷 第一次找规律A了一道紫题,写篇博客纪念一下. 这题很明显是数位dp,但是身为蒟蒻我不会呀,于是就像分块打表水过去. 数据范围是\(10^{12}\),我就\(10^6\)一百万一百万的打表. 于 ...
- [洛谷P2602][ZJOI2010]数字计数
题目大意:求区间$[l,r]$中数字$0\sim9$出现个数 题解:数位$DP$ 卡点:无 C++ Code: #include <cstdio> #include <iostrea ...
- Luogu P2602 [ZJOI2010]数字计数 数位DP
很久以前就...但是一直咕咕咕 思路:数位$DP$ 提交:1次 题解:见代码 #include<cstdio> #include<iostream> #include<c ...
- 洛谷P2602 [ZJOI2010]数字计数 题解
题目描述 输入格式 输出格式 输入输出样例 输入样例 1 99 输出样例 9 20 20 20 20 20 20 20 20 20 说明/提示 数据规模与约定 分析 很裸的一道数位DP的板子 定义f[ ...
- 洛谷P2602 [ZJOI2010] 数字计数 (数位DP)
白嫖的一道省选题...... 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 usin ...
- UVA.1640.The Counting Problem / BZOJ.1833.[ZJOI2010]数字计数(数位DP)
题目链接 \(Description\) 求\([l,r]\)中\(0,1,\cdots,9\)每个数字出现的次数(十进制表示). \(Solution\) 对每位分别DP.注意考虑前导0: 在最后统 ...
- BZOJ1833或洛谷2602 [ZJOI2010]数字计数
BZOJ原题链接 洛谷原题链接 又是套记搜模板的时候.. 对\(0\sim 9\)单独统计. 定义\(f[pos][sum]\),即枚举到第\(pos\)位,前面枚举的所有位上是当前要统计的数的个数之 ...
- 【洛谷P2602】数字计数
题目大意:求 [a,b] 中 0-9 分别出现了多少次. 题解:看数据范围应该是一个数位dp. 在 dfs 框架中维护当前的位置和到当前位置一共出现了多少个 \(x,x\in [0,9]\).因此,用 ...
随机推荐
- idea中以maven工程的方式运行tomcat源码
0. 准备环境 idea+jdk8+tomcat源码 1.下载tomcat源码: http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/ ...
- 关系型数据库MySQL(二)_索引
优点 大大加快数据的查询速度 创建唯一性索引,保证数据库表中每一行数据的唯一性 在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间 缺点 索引需要占物理空间 当对表中的数据进行增删 ...
- Html5 学习笔记 --》布局
不推荐: 浮动布局: footer 设置 clear : both 清理浮动 | header | |边 | | |内 | 内容 ...
- HBase–RegionServer宕机恢复原理
Region Server宕机总述 HBase一个很大的特色是扩展性极其友好,可以通过简单地加机器实现集群规模的线性扩展,而且机器的配置并不需要太好,通过大量廉价机器代替价格昂贵的高性能机器.但也正因 ...
- windows 安装多个mysql
安装多个mysql,其实很简单,网上资料也很多,我整理一下,也跟着来凑个热闹. 1.下载mysql zip 解压到指定目录,我这边就3个,更多也类似 d:\mysql1 d:\mysql2 d:\my ...
- k8s的快速使用手册
一.快速搭建文档 一.初始化kubernete kubeadm init --kubernetes-version=v1. --apiserver-advertise-address=192.168. ...
- 用户积分排行榜功能-Redis实现
一.排行榜功能简介 排行榜功能是一个很普遍的需求.使用 Redis 中有序集合(SortedSet)的特性来实现排行榜是又好又快的选择. 一般排行榜都是有实效性的,比如交通数据流中的路口/路段的车流量 ...
- windows下基于(QPC)实现的微秒级延时
1.为什么会写windows下微秒级延时 在上一篇 实现memcpy()函数及过程总结 中测试memcpy的效率中,测试时间的拷贝效率在微秒级别,需要使用微秒级时间间隔计数. windows下提供Qu ...
- cocos2D-X 屏幕适配
{ //https://v.youku.com/v_show/id_XNTIzOTM1MDYw.html }
- SQL 左连接
SQL左链接LEFT JOIN关键字返回左表(表1)中的所有行,即使在右表(表2)中没有匹配.如果在正确的表中没有匹配,结果是NULL. SQL LEFT JOIN 语法 SELECT _column ...