Description

题库链接

问你 \([l,r]\) 区间内所有整数中各个数码出现了多少次。

\(1\leq a\leq b\leq 10^{12}\)

Solution

数位 \(DP\) 。

定义一个函数 \(cal(i)\) 为求 \([1,i)\) 中所有整数各个数码的和。显然答案就是 \(cal(r+1)-cal(l)\) 。

考虑如何求 \(cal(x)\) 。

先考虑数的位数小于 \(x\) 的情况。假设 \(x\) 的总位数为 \(tot\) 。我们可以从 \(1\sim tol-1\) 来枚举最高位。对于每次枚举的最高位 \(i\) ,显然最高位上的每个数都会计算 \(10^{i-1}\) 次, \(0\) 除外。再考虑以其为最高位开头。之后的所有数码产生的新贡献为 \(9(i-1)\cdot 10^{i-2}\) 其中 \(9\) 表示最高位有 \([1,9]\) 这 \(9\) 个数; \(i-1\) 表示之后共有 \(i-1\) 位。 \(10^{i-2}\) 指的是每一位会产生贡献(推推式子可以证明后面的每一位的数码出现频率是相同的)。

最高位等于 \(tot\) 的情况和上面是类似的,假设 \(x_i\) 为 \(x\) 的第 \(i\) 位上的数字。显然对于小于 \(x_i\) 的所有数码(包括除最高位外的 \(0\) ),都会计算 \(10^{i-1}\) 次。而 \(x_i\) 只会计算 \(last\) 次,其中 \(last\) 为 \(i\) 位之后的数字;之后的所有数码产生的新贡献和上面类似,详可见代码。

Code

//It is made by Awson on 2018.2.28
#include <bits/stdc++.h>
#define LL long long
#define dob complex<double>
#define Abs(a) ((a) < 0 ? (-(a)) : (a))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Swap(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b))
#define writeln(x) (write(x), putchar('\n'))
#define lowbit(x) ((x)&(-(x)))
using namespace std;
void read(LL &x) {
char ch; bool flag = 0;
for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || 1); ch = getchar());
for (x = 0; isdigit(ch); x = (x<<1)+(x<<3)+ch-48, ch = getchar());
x *= 1-2*flag;
}
void print(LL x) {if (x > 9) print(x/10); putchar(x%10+48); }
void write(LL x) {if (x < 0) putchar('-'); print(Abs(x)); } LL x, y, cnt[15]; void cal(LL x) {
LL a[20], tot = 0, mi = 1, last = 0; while (x) a[++tot] = x%10, x /= 10;
for (int i = 1; i < tot; i++) {
for (int d = 1; d < 10; d++) cnt[d] += mi;
for (int d = 0; d < 10; d++) cnt[d] += mi*9/10*(i-1); mi *= 10;
}
mi = 1;
for (int i = 1; i <= tot; i++) {
cnt[a[i]] += last; int begin = (i == tot);
for (int d = begin; d < a[i]; d++) cnt[d] += mi;
if (a[i]) for (int d = 0; d < 10; d++) cnt[d] += mi*(a[i]-begin)/10*(i-1);
last += mi*a[i], mi *= 10;
}
}
void work() {
read(x), read(y);
cal(x); for (int i = 0; i < 10; i++) cnt[i] = -cnt[i];
cal(y+1); for (int i = 0; i < 9; i++) write(cnt[i]), putchar(' '); writeln(cnt[9]);
}
int main() {
work(); return 0;
}

[ZJOI 2010]count 数字计数的更多相关文章

  1. 【BZOJ-1833】count数字计数 数位DP

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 2494  Solved: 1101[Submit][ ...

  2. [BZOJ1833][ZJOI2010]count 数字计数

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

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

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

  4. 1833: [ZJOI2010]count 数字计数

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 2951  Solved: 1307[Submit][ ...

  5. BZOJ_1833_[ZJOI2010]count 数字计数_数位DP

    BZOJ_1833_[ZJOI2010]count 数字计数_数位DP 题意: 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 分析: 数位DP f[i][ ...

  6. BZOJ1833 ZJOI2010 count 数字计数 【数位DP】

    BZOJ1833 ZJOI2010 count 数字计数 Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包 ...

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

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

  8. 【BZOJ】1833 [ZJOI2010]count 数字计数

    [算法]数位DP [题解] 记忆化搜索 #include<cstdio> #include<algorithm> #include<cstring> #define ...

  9. 1833: [ZJOI2010]count 数字计数 - BZOJ

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

随机推荐

  1. <经验杂谈>C#对CA证书加密解密的简单介绍

    最近做项目接触了一些关于用CA证书加密解密的知识,现在分享一下,加密主要分为对称加密和非对称加密以及单项加密这三种,CA是一个权威的第三方认证机构,CA加密有公钥和私钥之分. 以下是C#读取证书文件进 ...

  2. Java基础学习笔记二十四 MySQL安装图解

    .MYSQL的安装 1.打开下载的mysql安装文件mysql-5.5.27-win32.zip,双击解压缩,运行“setup.exe”. 2.选择安装类型,有“Typical(默认)”.“Compl ...

  3. Ubuntu安装MariaDB教程

    一.环境 服务器:Ubuntu 16.04.1 LTS(GUN/Linux 4.4.0-91-generic x86_64) 数据库版本:MariaDB 10.3 二.安装流程 2.1 进入Maria ...

  4. JAVA读取Excel中内容(HSSF和Workbook两种方法)

    内容添加,以前是用的HSSF,前几天帮同学写一个统计表用了Workbook,现在码一下. ---新内容(Workbook)--- 同学要统计一个xls表格,让表1里面的某一列内容对表2里面的每列进行匹 ...

  5. 【Alpha】阶段总结报告

    团队成员 陈家权 031502107 赖晓连 031502118 雷晶 031502119 林巧娜 031502125 庄加鑫 031502147 一.项目预期计划及现实进展 项目预期计划 现实进展 ...

  6. Welcome to StackEdit!

    Welcome to StackEdit! Hey!our first Markdown document in StackEdit1. Don't delete me, I'm very helpf ...

  7. Android属性动画 nineoldandroids

    各种资源链接 nineoldandroids 任玉刚的五个图片滑动,点击menu http://blog.csdn.net/singwhatiwanna/article/details/1763998 ...

  8. JAVA_SE基础——50.接口关系下的多态

    接口关系下的多态和继承关系下的多态 相差无几,应该更简单些~ 多态: 父类的引用类型变量指向了子类的对象或者是接口类型的引用类型变量指向了接口实现类 的对象. 实现关系下的多态: 接口  变量  = ...

  9. 彻底搞懂shell的高级I/O重定向

    本文目录: 1.1 文件描述符(file description,fd) 1.2 文件描述符的复制 1.3 重定向顺序很重要:">file 2>&1"和&quo ...

  10. .Net EntityFramwork6.0 EF框架开发入门

    一.环境 开发环境:Sqlserver2008 R2.Visual Studio2012   二.准备工作 1.新建MVC空项目 2.通过NuGet获取 EntityFramework 包  操作截图 ...