[ZJOI2010] 数字统计

题目

给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。

INPUT

输入文件中仅包含一行两个整数a、b,含义如上所述

OUTPUT

输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次。

SAMPLE

INPUT

1 99

OUTPUT

9 20 20 20 20 20 20 20 20 20

解题报告

第二道数位$dp$,找着点感觉了?

首先,我们预处理出来从低向高位数第$i$位数,每个数码出现的次数,递推式很简单

$$f[i]=10*f[i-1]+10^{i-1}$$

我们分两部分考虑即可,第$i$位为该数字的数有$10^{i-1}$个,后$i-1$位数该该数字出现的次数为$f[i-1]$,前面的数共有$10$种可能(允许前导0),故$f[i]=10*f[i-1]+10^{i-1}$

然后考虑如何统计答案。

对于低于该数位数的数,我们可以去除前导零,对上式进行变形(具体式子见代码),求和即可

对于位数等于该数位数的数,我们可以逐位枚举统计,利用处理出来的$f$数组和$10^{i}$进行转移即可

 #include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long L;
L a,b,f[],pw[],ans[];
int num[],top;
inline void solve(L x,int flag){
if(!x)return;
top=;L ret(x);
while(x){num[++top]=x%;x/=;}
for(int i=;i<top;++i)
for(int j=;j<=;++j)
ans[j]+=flag*(*f[i-]+(j?pw[i-]:));
for(int i=top;i;--i){
ret-=num[i]*pw[i-];ans[num[i]]+=(ret+)*flag;
for(int j=(i==top);j<num[i];++j)ans[j]+=pw[i-]*flag;
for(int j=;j<=;++j)ans[j]+=f[i-]*(num[i]-(i==top))*flag;
}
}
int main(){
freopen("countzj.in","r",stdin);freopen("countzj.out","w",stdout);
scanf("%lld%lld",&a,&b);
pw[]=;for(int i=;i<=;++i)f[i]=*f[i-]+pw[i-],pw[i]=pw[i-]*;
solve(b,);solve(a-,-);
printf("%lld",ans[]);for(int i=;i<=;++i)printf(" %lld",ans[i]);
}

[ZJOI2010] 数字统计的更多相关文章

  1. 数字统计类题目的非数位DP解法

    ZJOI2010 数字统计 上题题意为求[l,r]区间中每个数字(0~9)出现的次数 一般的做法为将区间当成[0,r]-[0,l-1],然后进行数位DP 但事实上将区间当成[0,r]-[0,l-1]后 ...

  2. P2602 [ZJOI2010]数字计数&P1239 计数器&P4999 烦人的数学作业

    P2602 [ZJOI2010]数字计数 题解 DFS 恶心的数位DP 对于这道题,我们可以一个数字一个数字的求 也就是分别统计区间 [ L , R ] 内部数字 i 出现的次数 (0<=i&l ...

  3. AC日记——数字统计 openjudge 1.5 41

    41:数字统计 总时间限制:  1000ms 内存限制:  65536kB 描述 请统计某个给定范围[L, R]的所有整数中,数字2出现的次数. 比如给定范围[2, 22],数字2在数2中出现了1次, ...

  4. zznu 1255 数字统计(数位DP, 数学方法)

    最近在学数位DP, 感觉还是满有收获的! 做了几个题之后想起来自己OJ上曾经做的一道题,以前是用数学方法写的,现在改用数位DP来写了一遍. 题目: 1255: 数字统计 时间限制: 1 Sec  内存 ...

  5. Vijos P1784 数字统计【模拟】

    数字统计 背景 来自 NOIP2010 普及组 第一题 描述 请统计某个给定范围[L, R]的所有整数中,数字2出现的次数. 比如在给定范围[2, 22],数字2在数2中出现了1次,在数12中出现了1 ...

  6. 数字统计(NOIP2010)

    题目链接:数字统计 这题很水. 思路就是:枚举每一个区间内的数,然后对于每一个数,每个位去判断是否为2,就行了. 下面上代码: #include<bits/stdc++.h> using ...

  7. LintCode——数字统计

    数字统计:计算数字k在0到n中的出现的次数,k可能是0~9的一个值 样例:例如n=12,k=1,在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],我们发现1出现 ...

  8. 【洛谷】2602: [ZJOI2010]数字计数【数位DP】

    P2602 [ZJOI2010]数字计数 题目描述 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 输入输出格式 输入格式: 输入文件中仅包含一行两个整数a ...

  9. 一款纯css3实现的数字统计游戏

    今天给大家分享一款纯css3实现的数字统计游戏.这款游戏的规则的是将所有的数字相加等于72.这款游戏的数字按钮做得很美观,需要的时候可以借用下.一起看下效果图: 在线预览   源码下载 实现的代码. ...

随机推荐

  1. PHP 简单答题系统

    --sample 1: <!DOCTYPE html><html><head> <title>登录</title> <style ty ...

  2. 1270 数组的最大代价 dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1270&judgeId=194704 一开始贪心,以为就两种情况, ...

  3. js ajax 数组类型参数传递

    若一个请求中包含多个值,如:(test.action?tid=1&tid=2&tid=3),参数都是同一个,只是指定多个值,这样请求时后台会发生解析错误,应先使用 tradititon ...

  4. 使用nginx搭建简单文件服务器

    最近再做一个博客,本想使用fastdfs标准的文件存储服务器,但考虑到资源占用问题,且使用nginx比较快速,且效果不差.于是采用ngixn搭建. nginx搭建文件服务器,本质上就是nginx的静态 ...

  5. ES之事件绑定,解除绑定以及事件冒泡、事件捕获

    绑定事件的处理方法任何元素都有事件属性,而绑定事件就是将这个事件与一个函数相连接. ①句柄事件dom.onXXX = function () {代码块} 以on开头的事件属于句柄事件兼容性非常好,但是 ...

  6. lua使用lfs.dll库进行文件操作

    在项目开发中,为了提高开发效率往往需要开发一些辅助工具.最近在公司用lua帮拓展了一个资源扫描的工具,这个工具的功能就是从原始demo下指定目标资源文件,对该文件进行读取并筛选过滤一遍然后拷贝到最终d ...

  7. JavaScript——responseType

    https://www.cnblogs.com/cdemo/p/5225848.html https://blog.csdn.net/wkyseo/article/details/78232485 异 ...

  8. 迅为7寸Android嵌入式安卓触摸屏,工业一体机方案

    嵌入式安卓触摸屏板卡介绍-工业级核心板: 嵌入式安卓触摸屏功能接口介绍: 品质保障: 核心板连接器:进口连接器,牢固耐用,国产连接器无法比拟(为保证用户自行设计的产品品质,购买核心板用户可免费赠送底板 ...

  9. python练习2 购物车程序

    # -*- coding: utf-8 -*-# @Time : 2018/10/18 16:06# @Author : Two Brother# @EMAIL : yeluyide@163.com# ...

  10. CAD参数绘制圆弧(网页版)

    在CAD设计时,需要绘制圆弧,用户可以在图面点圆弧起点,圆弧上的一点和圆弧的终点,这样就绘制出圆弧. 主要用到函数说明: _DMxDrawX::DrawArc2 由圆弧上的三点绘制一个圆弧.详细说明如 ...