这算是一道数位DP的入门题了吧虽然对于我来说还是有点烦

经典起手式不讲了吧,\(ans(a,b)\to ans(1,b)-ans(1,a-1)\)

我们首先预处理一个东西,用\(f_i\)表示有\(i\)位数字的时候,每个数字有几个(注意是和)。若不考虑前导零,则所有数字都是等价的,转移为:

\(f_i=10\cdot f_{i-1}+10^{i-1}\)

这个还是比较好理解的吧,前面一项表示无论这一位放什么直接从前面拿过来已有的,所以这一位可以放\(0\to9\)十个数,后面一项表示当这一位放上想要的数字时和前面得出的贡献。

我们发现这样就很巧妙的避免了重复,因为前后两次计算刚好会产生多次贡献。

然后考虑如何根据\(f_i\)推出答案。假设现在的数为\(ABCD\)

和常规的数位DP一样,我们优先考虑首位对答案的共献,由于\(1000,2000,...,A000\)都小于等于\(ABCD\),可以直接加入贡献,所以我们将答案加上\(A\cdot f_3\)即可。

然后就是剩下的\(A000\to ABCD\)部分了,但是我们发现这个的求解过程就相当于\(BCD\)的贡献。

所以我们成功将大问题分解,接下来就是继续算下一位的贡献了

最后还有一个关于前导零的问题了,我们继续手玩一波

当首位为\(0\)时,后面的\(10^{i-1}\)位都是不合法的,以此类推,当前两位为\(0\)时,后面的\(10^{i-2}\)位也不合法。

因此\(0\)的贡献应该减去\(\sum_{i=0}^{len-1} 10^i\)(\(len\)表示数字位数)

然后可喜可贺,终于做完了,上CODE吧

#include<cstdio>
#include<cctype>
using namespace std;
const int N=15;
const long long pow[12]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000,100000000000};
long long a,b,c[10],d[10],f[N];
int bit[N],cnt;
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(long long &x)
{
x=0; char ch; while (!isdigit(ch=tc()));
while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline void write(long long x)
{
if (x>9) write(x/10);
putchar(x%10+'0');
}
inline void init(void)
{
for (register int i=1;i<=12;++i) f[i]=f[i-1]*10+pow[i-1];
}
inline void resolve(long long x)
{
cnt=0; while (x) bit[++cnt]=x%10,x/=10;
}
inline void solve(long long x,long long *num)
{
register int i,j; resolve(x);
for (i=cnt;i>=1;--i)
{
for (j=0;j<bit[i];++j) num[j]+=pow[i-1];
for (j=0;j<=9;++j) num[j]+=f[i-1]*bit[i];
long long tot=0;
for (j=i-1;j>=1;--j) tot=tot*10+bit[j];
num[bit[i]]+=tot+1; num[0]-=pow[i-1];
}
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i; read(a); read(b); init();
solve(a-1,c); solve(b,d);
for (i=0;i<=9;++i) write(d[i]-c[i]),putchar(' ');
return 0;
}

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

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

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

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

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

  3. P2602 [ZJOI2010]数字计数(递推)

    P2602 [ZJOI2010]数字计数 思路: 首先考虑含有前导0的情况,可以发现在相同的\(i\)位数中,每个数的出现次数都是相等的.所以我们可以设\(f(i)\)为\(i\)位数每个数的出现次数 ...

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

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

  5. 数位dp详解&&LG P2602 [ZJOI2010]数字计数

    数位dp,适用于解决一类求x~y之间有多少个符合要求的数或者其他. 例题 题目描述 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除 ...

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

    数字计数 题目传送门 解题思路 用\(dp[i][j][k]\)来表示长度为\(i\)且以\(j\)为开头的数里\(k\)出现的次数. 则转移方程式为:\(dp[i][j][k] += \sum_{t ...

  7. P2602 [ZJOI2010]数字计数

    https://www.luogu.org/problemnew/show/P2602 数位dp #include <bits/stdc++.h> using namespace std; ...

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

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

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

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

随机推荐

  1. Flutter 布局(九)- Flow、Table、Wrap详解

    本文主要介绍Flutter布局中的Flow.Table.Wrap控件,详细介绍了其布局行为以及使用场景,并对源码进行了分析. 1. Flow A widget that implements the ...

  2. Android Studio列表用法之一:ListView图文列表显示(实例)

    前言: ListView这个列表控件在Android中是最常用的控件之一,几乎在所有的应用程序中都会使用到它. 目前正在做的一个记账本APP中就用到了它,主要是用它来呈现收支明细,是一个图文列表的呈现 ...

  3. asp.net core中IHttpContextAccessor和HttpContextAccessor的妙用

    分享一篇文章,关于asp.net core中httpcontext的拓展. 现在,试图围绕HttpContext.Current构建你的代码真的不是一个好主意,但是我想如果你正在迁移一个企业类型的应用 ...

  4. Vue2 框架开发的单页程序页面首次加载慢的原因与优化方案

    在用Vue2 框架进行单页面开发时,开发完成后项目打包到线上环境,发现vendor脚本有963K,app.css文件也有四百多k,用户第一次打开网页加载这两个文件要十多秒,会使页面白屏十多秒,之后再次 ...

  5. 修改Devexpress DateEdit控件默认的日期格式和日历风格

    最近项目中很多地方使用到DevExpress的DateEdit控件,而且设置都是一致(日期格式.选择日期的日历的风格等).每一次都需要设置太痛苦,因此需要寻找一种高效的解决方式. 一. 设置好一个作为 ...

  6. MySQL 8.0 —— CATS事务调度算法的性能提升

    原文地址:https://mysqlserverteam.com/contention-aware-transaction-scheduling-arriving-in-innodb-to-boost ...

  7. WFE和WFI的区别

    1. 概念: WFI(Wait for interrupt)和WFE(Wait for event)是两个让ARM核进入low-power standby模式的指令,由ARM architecture ...

  8. nginx 编译安装时的编译参数说明(不建议看)

    https://www.cnblogs.com/wazy/p/8108824.html ./configure --user=www \ #worker进程运行用户 --group=www \ #wo ...

  9. January 23rd, 2018 Week 04th Tuesday

    Remembrance is a form of meeting, forgetfulness is a form of freedom. 记忆是一种相遇,遗忘是一种自由. Cherish those ...

  10. Linux驱动的两种载入方式过程分析

    一.概念简述 在Linux下能够通过两种方式载入驱动程序:静态载入和动态载入. 静态载入就是把驱动程序直接编译进内核.系统启动后能够直接调用.静态载入的缺点是调试起来比較麻烦,每次改动一个地方都要又一 ...