【题目链接】

http://www.lydsy.com/JudgeOnline/problem.php?id=1833

【题意】

统计[a,b]区间内各数位出现的次数。

【思路】

设f[i][j][k]表示i位数,最高位为j,数位k出现的次数,则有递推式:

f[i][j][k]=sigma{ f[i-1][l][k] ,0<=l<=9 } + 10^(i-1)

第一项统计的是i-1位数中k的出现次数,后一项统计的是最高位k的出现数目。

将查询差分,对于一个数,先统计长度不超过len的,再统计长度=len但最高位比a[len]小的,再统计长度为len且最高位为a[len]的。

注意最后一项的统计,假设n为4321,我们要统计的就是:

4000..4299

4300..4319

4320..4321

假设我们要统计4000..4299,则有;

ans[k]+=f[3][3][k]

ans[4]+=321+1

【代码】

 #include<cstdio>
#include<cstring>
#include<iostream>
#define FOR(a,b,c) for(int a=b;a<=c;a++)
using namespace std; typedef long long ll;
const int N = ; struct Node{
ll a[N];
Node() {
memset(a,,sizeof(a));
}
ll& operator[] (const int& x) {
return a[x];
}
};
Node operator + (const Node& x,const Node& y) {
Node tmp;
FOR(i,,) tmp.a[i]=x.a[i]+y.a[i];
return tmp;
} int len,a[N];
ll e[N]; Node f[N][N]; void init(ll n)
{
len=;
while(n) {
a[++len]=n%;
n/=;
}
FOR(i,,) f[][i][i]=;
FOR(i,,) FOR(j,,) {
FOR(k,,)
f[i][j]=f[i][j]+f[i-][k];
f[i][j][j]+=e[i-];
}
}
Node calc(ll n)
{
Node ans;
if(!n) return ans;
memset(f,,sizeof(f));
init(n);
FOR(i,,len-) FOR(j,,)
ans=ans+f[i][j];
FOR(i,,a[len]-) ans=ans+f[len][i];
n%=e[len-];
ans[a[len]]+=n+;
for(int i=len-;i;i--) {
for(int j=;j<a[i];j++) ans=ans+f[i][j];
n%=e[i-];
ans[a[i]]+=n+;
}
return ans;
} int main()
{
e[]=;
FOR(i,,) e[i]=e[i-]*10ll;
ll x,y;
scanf("%lld%lld",&x,&y);
Node ans1=calc(y) , ans2=calc(x-);
FOR(i,,) printf("%lld ",ans1[i]-ans2[i]);
printf("%lld\n",ans1[]-ans2[]);
return ;
}

bzoj 1833 [ZJOI2010]count 数字计数(数位DP)的更多相关文章

  1. BZOJ 1833 ZJOI2010 count 数字计数 数位DP

    题目大意:求[a,b]间全部的整数中0~9每一个数字出现了几次 令f[i]为i位数(算前导零)中每一个数出现的次数(一定是同样的,所以仅仅记录一个即可了) 有f[i]=f[i-1]*10+10^(i- ...

  2. 1833: [ZJOI2010]count 数字计数——数位dp

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1833 省选之前来切一道裸的数位dp.. 题意 统计[a,b]中0~9每个数字出现的次数(不算 ...

  3. BZOJ 1833: [ZJOI2010]count 数字计数( dp )

    dp(i, j, k)表示共i位, 最高位是j, 数字k出现次数. 预处理出来. 差分答案, 对于0~x的答案, 从低位到高位进行讨论 -------------------------------- ...

  4. bzoj1833: [ZJOI2010]count 数字计数(数位DP+记忆化搜索)

    1833: [ZJOI2010]count 数字计数 题目:传送门 题解: 今天是躲不开各种恶心DP了??? %爆靖大佬啊!!! 据说是数位DP裸题...emmm学吧学吧 感觉记忆化搜索特别强: 定义 ...

  5. [bzoj1833][ZJOI2010]count 数字计数——数位dp

    题目: (传送门)[http://www.lydsy.com/JudgeOnline/problem.php?id=1833] 题解: 第一次接触数位dp,真的是恶心. 首先翻阅了很多很多一维dp,因 ...

  6. [BZOJ 1833] [ZJOI2010] count 数字计数 【数位DP】

    题目链接:BZOJ - 1833 题目分析 数位DP .. 用 f[i][j][k] 表示第 i 位是 j 的 i 位数共有多少个数码 k . 然后差分询问...Get()中注意一下,如果固定了第 i ...

  7. bzoj 1833: [ZJOI2010]count 数字计数【数位dp】

    非典型数位dp 先预处理出f[i][j][k]表示从后往前第i位为j时k的个数,然后把答案转换为ans(r)-ans(l-1),用预处理出的f数组dp出f即可(可能也不是dp吧--) #include ...

  8. BZOJ 1833: [ZJOI2010]count 数字计数

    Description 问 \([L,R]\) 中0-9的个数. Sol 数位DP. 预处理好长度为 \(i\), 最高位为 \(j\) 的数位之和. 然后从上往下计算,不要忘记往下走的同时要把高位的 ...

  9. bzoj1833: [ZJOI2010]count 数字计数 数位dp

    bzoj1833 Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. O ...

随机推荐

  1. 使用rsyslog+loganalzey收集日志显示客户端ip

    http://www.ituring.com.cn/article/128536 rsyslog localhost 转发 http://bigsec.net/one/tool/rsyslog.htm ...

  2. mybatis传入map参数parameterType

    基本数据类型:包含int,String,Date等.基本数据类型作为传参,只能传入一个.通过#{参数名} 即可获取传入的值 复杂数据类型:包含JAVA实体类.Map.通过#{属性名}或#{map的Ke ...

  3. MSSQLServer基础02(SQL语句入门(脚本、命令))

    SQL 全名是结构化查询语言(Structured Query Language),是关系数据库管理系统的标准语言 SQL语句是和DBMS“交谈”专用的语句,不同DBMS都认SQL语法. SQL语句中 ...

  4. 214. Shortest Palindrome

    题目: Given a string S, you are allowed to convert it to a palindrome by adding characters in front of ...

  5. RxJava学习( 二)

    1) Scheduler 的 API (一) 在RxJava 中,Scheduler ——调度器,相当于线程控制器,RxJava 通过它来指定每一段代码应该运行在什么样的线程.RxJava 已经内置了 ...

  6. Android安全问题 抢先接收广播 - 内因篇之广播接收器注册流程

    导读:本文说明系统是如何注册动态广播以及静态广播,这里主要注意其注册的顺序 这篇文章主要是针对我前两篇文章 android安全问题  抢先开机启动 - 结果篇 android安全问题  抢先拦截短信 ...

  7. http_build_query函数(学习)

    http_build_query函数   http_build_query -- 生成 url-encoded 之后的请求字符串 描述 string http_build_query ( array ...

  8. Windows使用virtualenv搭建flask开发环境

    virtualenv: VirtualEnv用于在一台机器上创建多个独立的Python虚拟运行环境,多个Python环境相互独立,互不影响,它能够: 在没有权限的情况下安装新套件 不同应用可以使用不同 ...

  9. Windows下Vim设置

    进入安装目录,找到_vimrc文件,用文本编辑器打开,在前面加入下述内容 设置中文支持 " 设置编码自动识别, 中文引号显示 " set fileencodings=utf-8,c ...

  10. 1306.Sequence Median(堆排序)

    1306 URAL真是没水题 以为简单的排序就好了 ME  内存限制很紧 堆排序 或者 STL 用堆排序做的 正好复习一下 都忘了 #include <iostream> #include ...