洛谷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]\).因此,用 ...
随机推荐
- Python Django 编写一个简易的后台管理工具3-运行项目
编写view页面 def hello(request): return render(request,'hello.html') 编写html页面 <!DOCTYPE html> < ...
- jQuery判断checkbox是否选中及获取选中值
方法一:if ($("#checkbox-id")get(0).checked) { // do something} 方法二:if($('#checkbox-id').is ...
- OpenCV2马拉松第9圈——再谈对照度(对照度拉伸,直方图均衡化)
收入囊中 lookup table 对照度拉伸 直方图均衡化 葵花宝典 lookup table是什么东西呢? 举个样例,假设你想把图像颠倒一下,f[i] = 255-f[i],你会怎么做? for( ...
- leetcode-350- 两个数组的交集 II
问题: package com.example.demo; import java.util.ArrayList; import java.util.Arrays; import java.util. ...
- 49.求1+2+3+.......+n
题目描述: 求1+2+3+...+n的值,要求不能使用乘除法,还有,if,while,for等关键字. 思路分析: 使用递归的解法,但是递归的终止条件需要使用if关键字不符合要求,所以我们利用 ...
- 数据存入hive数据表之前对.csv(数据集)文件的预处理以及数据的上传
对于数据集文件,在将其中的数据存入hive之前,需要将数据进行预处理. 1.删除文件第一行记录,即字段名称 sed -i '1d' raw_user //1d表示删除第1行,同理,3d表示删除第3行, ...
- 使用await写异步优化代码
使用promise: function readMsg(){ return dispatch=>{ axios.post('/msgList').then(res=>{ console.l ...
- 使用while循环实现菜单
- matlab直接运行fig文件时报错
Matlab里面所的程序都是以.m的脚本文件形式保存的,所有运行的都是m文件.所以,对于guide生成的GUI程序,打开的方式有两种: 一:打开.m文件,点击m文件上的运行按钮,会自动弹出figure ...
- 小程序内嵌H5页面判断微信及小程序环境
判断微信及小程序环境 1.H5页面引入jweixin-1.3.2.js 2. var ua = window.navigator.userAgent.toLowerCase(); if(ua.matc ...