数字计数

题目传送门

解题思路

用\(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)的更多相关文章

  1. 洛谷P2602 [ZJOI2010]数字计数 题解 数位DP

    题目链接:https://www.luogu.com.cn/problem/P2602 题目大意: 计算区间 \([L,R]\) 范围内 \(0 \sim 9\) 各出现了多少次? 解题思路: 使用 ...

  2. 洛谷 P2602 [ZJOI2010]数字计数

    洛谷 第一次找规律A了一道紫题,写篇博客纪念一下. 这题很明显是数位dp,但是身为蒟蒻我不会呀,于是就像分块打表水过去. 数据范围是\(10^{12}\),我就\(10^6\)一百万一百万的打表. 于 ...

  3. [洛谷P2602][ZJOI2010]数字计数

    题目大意:求区间$[l,r]$中数字$0\sim9$出现个数 题解:数位$DP$ 卡点:无 C++ Code: #include <cstdio> #include <iostrea ...

  4. Luogu P2602 [ZJOI2010]数字计数 数位DP

    很久以前就...但是一直咕咕咕 思路:数位$DP$ 提交:1次 题解:见代码 #include<cstdio> #include<iostream> #include<c ...

  5. 洛谷P2602 [ZJOI2010]数字计数 题解

    题目描述 输入格式 输出格式 输入输出样例 输入样例 1 99 输出样例 9 20 20 20 20 20 20 20 20 20 说明/提示 数据规模与约定 分析 很裸的一道数位DP的板子 定义f[ ...

  6. 洛谷P2602 [ZJOI2010] 数字计数 (数位DP)

    白嫖的一道省选题...... 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 usin ...

  7. UVA.1640.The Counting Problem / BZOJ.1833.[ZJOI2010]数字计数(数位DP)

    题目链接 \(Description\) 求\([l,r]\)中\(0,1,\cdots,9\)每个数字出现的次数(十进制表示). \(Solution\) 对每位分别DP.注意考虑前导0: 在最后统 ...

  8. BZOJ1833或洛谷2602 [ZJOI2010]数字计数

    BZOJ原题链接 洛谷原题链接 又是套记搜模板的时候.. 对\(0\sim 9\)单独统计. 定义\(f[pos][sum]\),即枚举到第\(pos\)位,前面枚举的所有位上是当前要统计的数的个数之 ...

  9. 【洛谷P2602】数字计数

    题目大意:求 [a,b] 中 0-9 分别出现了多少次. 题解:看数据范围应该是一个数位dp. 在 dfs 框架中维护当前的位置和到当前位置一共出现了多少个 \(x,x\in [0,9]\).因此,用 ...

随机推荐

  1. vlc 学习网

    http://capricasoftware.co.uk/#/projects/vlcj/tutorial

  2. nginx相关总结

    1. Nginx 无法启动解决方法 在查看到 logs 中报了如下错误时: 0.0.0.0:80 failed (10013: An attempt was made to access a sock ...

  3. centosifcfg-eth0文件内容为空

    虚拟机安装好CentOS 6系统后,发现ip在每次重启后都会还原,用ifconfig查看是有eth0网卡的(也有可能只有回环网卡lo),于是查看eth0网卡配置文件,发现在 /etc/sysconfi ...

  4. LR 场景设置

    LR 场景设置group:多个脚本按照独立设置模式跑,各个脚本可以单独设置虚拟用户.运行时间scenario:多个脚本之间按照相同模式跑,将总的虚拟用户数按照一定比例分配给各个脚本 schedule ...

  5. 使用systemctl管理服务

    系统服务,开机不需要登录就能运行的程序(相当于开机自启)/usr/lib/systemd/system 用户服务,需要登录后才能运行的程序/usr/lib/systemd/user 目录下又存在两种类 ...

  6. 创建网关项目(Spring Cloud Gateway)

    创建网关项目 加入网关后微服务的架构图 创建项目 POM文件 <properties> <java.version>1.8</java.version> <s ...

  7. Swift——(六)Swift中的值类型

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/twlkyao/article/details/34855597     在Swift中,结构体和枚举 ...

  8. 【笔记目录2】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总

    当前标签: ASP.NET Core快速入门 共2页: 上一页 1 2  任务27:Middleware管道介绍 GASA 2019-02-12 20:07 阅读:15 评论:0 任务26:dotne ...

  9. MVC的布局页,视图布局页和分布页的使用

    一,结构如下图 二,布局页和视图布局页 1>使用方法一 _ViewStart.cshtml @{ Layout = "~/Views/Shared/_Layout.cshtml&quo ...

  10. k8s的存储卷

    存储卷查看:kubectl explain pods.spec.volumes 一.简单的存储方式 1)2个容器之间共享存储..(删除则数据消失) apiVersion: v1 kind: Pod m ...