[bzoj1833][ZJOI2010]count 数字计数——数位dp
题目:
(传送门)[http://www.lydsy.com/JudgeOnline/problem.php?id=1833]
题解:
第一次接触数位dp,真的是恶心。
首先翻阅了很多很多一维dp,因为要处理前缀0,所以根本搞不懂。
查询了dalaolidaxin的博客,又查阅了资料:
初探数位dp
才完全弄懂这个题。
具体的,我们设
f[i][j][k]为考虑所有i位数,最高位为j数,之中k的数目。
我们可以得出方程:
\]
\]
我们对这个方程作出解释:
前一项非常好理解,后一项的话就是前(i-1)位数共有\(10^{i-1}\)个,对于其中每一个,我们都可以在前面加k。
这样我们预处理出来了f。
然后我们考虑对于n分块计算。
以n = 4321为例。
首先统计3位及以下的数,这些数字没有限制,直接加就好。
然后统计4位数。
对于一个4位数,我们一位一位向下考虑,如果最高位<k,直接加,如果=k,加上n+1
具体见代码。
代码
#include <cstdio>
#include <cstring>
using namespace std;
#define ll long long
const int N = 25;
struct node {
ll a[N];
node() { memset(a, 0, sizeof(a)); }
ll &operator[](const int &x) { return a[x]; }
};
node operator+(const node &x, const node &y) {
node tmp;
for (int i = 0; i <= 9; i++)
tmp.a[i] = x.a[i] + y.a[i];
return tmp;
}
int len, a[N];
ll pow[N];
node f[N][N];
void init(ll n) {
len = 0;
while (n) {
a[++len] = n % 10;
n /= 10;
}
for (int i = 0; i <= 9; i++)
f[1][i][i] = 1;
for (int i = 2; i <= 14; i++) {
for (int j = 0; j <= 9; j++) {
for (int k = 0; k <= 9; k++)
f[i][j] = f[i][j] + f[i - 1][k];
f[i][j][j] += pow[i - 1];
}
}
}
node calc(ll n) {
node ans;
if (!n)
return ans;
memset(f, 0, sizeof(f));
init(n);
//统计前len-1位
for (int i = 1; i <= len - 1; i++) {
for (int j = 1; j <= 9; j++) {
ans = ans + f[i][j];
}
}
//开始统计len位数
for (int i = 1; i <= a[len] - 1; i++)
ans = ans + f[len][i];
n %= pow[len - 1];
ans[a[len]] += n + 1; //对于每一个最高位都可以统计一发
for (int i = len - 1; i; i--) {
for (int j = 0; j < a[i]; j++)
ans = ans + f[i][j];
n %= pow[i - 1];
ans[a[i]] += n + 1;
}
return ans;
}
int main() {
pow[0] = 1;
for (int i = 1; i <= 14; i++)
pow[i] = pow[i - 1] * 10;
ll x, y;
scanf("%lld %lld", &x, &y);
node ans1 = calc(y), ans2 = calc(x - 1);
for (int i = 0; i <= 8; i++)
printf("%lld ", ans1[i] - ans2[i]);
printf("%lld\n", ans1[9] - ans2[9]);
return 0;
}
[bzoj1833][ZJOI2010]count 数字计数——数位dp的更多相关文章
- bzoj1833: [ZJOI2010]count 数字计数(数位DP+记忆化搜索)
1833: [ZJOI2010]count 数字计数 题目:传送门 题解: 今天是躲不开各种恶心DP了??? %爆靖大佬啊!!! 据说是数位DP裸题...emmm学吧学吧 感觉记忆化搜索特别强: 定义 ...
- bzoj1833: [ZJOI2010]count 数字计数 数位dp
bzoj1833 Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. O ...
- 【BZOJ-1833】count数字计数 数位DP
1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 2494 Solved: 1101[Submit][ ...
- 1833: [ZJOI2010]count 数字计数——数位dp
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1833 省选之前来切一道裸的数位dp.. 题意 统计[a,b]中0~9每个数字出现的次数(不算 ...
- BZOJ 1833 ZJOI2010 count 数字计数 数位DP
题目大意:求[a,b]间全部的整数中0~9每一个数字出现了几次 令f[i]为i位数(算前导零)中每一个数出现的次数(一定是同样的,所以仅仅记录一个即可了) 有f[i]=f[i-1]*10+10^(i- ...
- BZOJ1833 ZJOI2010 count 数字计数 【数位DP】
BZOJ1833 ZJOI2010 count 数字计数 Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包 ...
- [BZOJ1833][ZJOI2010]count 数字计数
[BZOJ1833][ZJOI2010]count 数字计数 试题描述 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 输入 输入文件中仅包含一行两个整数a ...
- BZOJ1833 [ZJOI2010]count 数字计数 【数学 Or 数位dp】
题目 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 输入格式 输入文件中仅包含一行两个整数a.b,含义如上所述. 输出格式 输出文件中包含一行10个整数, ...
- bzoj1833: [ZJOI2010]count 数字计数&&USACO37 Cow Queueing 数数的梦(数位DP)
难受啊,怎么又遇到我不会的题了(捂脸) 如题,这是一道数位DP,随便找了个博客居然就是我们大YZ的……果然nb,然后就是改改模版++注释就好的了,直接看注释吧,就是用1~B - 1~A-1而已,枚举全 ...
随机推荐
- C语言进阶——注释符号12
注释可能大认为非常简单,但是注释其实在C语言中很关键,来看下面一段对话. ---学生: 老师,我觉得注释没有必要深究,因为很简单,对程序功能也没有影响. ---老师: 注释是C语言最重要的工具,我们先 ...
- C# 设定弹出窗体位置
一.C#中弹出窗口位置 加入命名空间 using System.Drawing using System.Windows.Forms 假定窗口名为form1,则 //窗体位置在屏幕中间 form1.S ...
- JAVA EE配TOMCAT
纯粹就是吧百度教程上的过程走了一遍发现不行综合各种教程配出来了,四张图代表了四个阶段,以后再要配的话直接来这里看.
- STM32无法使用IAR下载程序问题
一开始建立了工程,然后程序下载都很正常.不知道什么情况自己下载代码之后,再重新下载代码无法成功. 我按照提示找了一下FlashStm32f30x8.flash这个文件,却发现IAR的目录下没并没有.又 ...
- vue命令集合
创建vuecli脚手架:npm install -g @vue/cli拉取2的版本:npm install -g @vue/cli-init 创建webpack:npm i webpack@3.12. ...
- DOS程序员手册(三)
56页 第4章DOS和BIOS接口 本章介绍了用户程序访问DOS内核和BIOS所提供的各种服务的方法.为了访问这 些服务,我们可以从任何编程语言中调用各个软件中断,这些中断便是我们在本 ...
- Python 协程与事件循环
Table of Contents 前言 协程 async & await 事件循环 asyncio 的事件循环 结语 参考链接 前言 Python 标准库 asyncio 是我目前接触过的最 ...
- Flask 教程精简版之一(系列片)
Flask 教程精简版之一(系列片) 现在连教程都有精简版 准备 1.要学会 Flask 之前必须掌握 Python 基本使用. 2.会使用简单的 HTML 效果更加 3.若想练气功必须先自暴自弃 简 ...
- 【转载】Unity3D研究院之IOS触摸屏手势控制镜头旋转与缩放
前几篇文章介绍了很多Unity3D引擎自身的一些问题, 今天我们在回到IOS设备上讨论一些触摸屏幕手势,本章的目标是通过触摸iPhone屏幕手势 实现模型左右的旋转,与模型的缩放. 大家想一想模型的旋 ...
- (原)Skeletal With DirectX12
@author: 白袍小道 @来源: Advanced Animation with DirectX, 游戏引擎架构 (暗影不解释连招) 引言: 3D模型动画的基本原理是让模型 ...