<更新提示>

<第一次更新>


<正文>

The Counting Problem

Description

求 [L,R]内每个数码出现的次数。

Input Format

若干行,一行两个正整数 L 和 R。

最后一行 L=R=0,表示输入结束。

Output Format

若干行,对于每个询问做出回答,每行 10 个整数,依次表示 0 至 9 出现的次数。

输入的最后一行不属于询问,因此不必对此做出回答。

Sample Input

1 10
114 514
233 666
19260421 19260817
19190504 19890605
0 0

Sample Output

1 2 1 1 1 1 1 1 1 1
80 167 180 180 181 95 80 80 80 80
83 83 150 191 194 194 158 83 83 83
476 475 476 80 159 180 577 180 97 476
350124 1059618 450020 450020 450021 450117 450026 450020 440626 1050224

解析

考虑数位\(dp\),设\(f[i][j][k]\)代表长度为\(i\)的数中,最高位为\(j\),数码\(k\)的出现次数和。以长度作为阶段,可以轻松转移:

\[f[i][j][k]=\sum_{p=0}^9f[i-1][p][k]
\]

当然,对于\(j=k\)的情况,还要加上\(10^{i-1}\),作为最高位数码的贡献。

然后考虑对于一个具体的数值\(x\),求出\(1-x\)的答案。

首先我们可以利用预处理的\(dp\)数组快速得到长度小于\(x\)的长度的答案。然后考虑计算长度等于\(x\)的长度的答案。

从高位到低位枚举,如果当且位小于\(x\)的这一位的话,后面的数字可以随便填,直接累加答案即可,反之累加当前位贡献,继续考虑下一位。

\(Code:\)

#include <bits/stdc++.h>
using namespace std;
const int SIZE = 13;
int cnt,num[SIZE];
long long f[SIZE][10][10],ans[10][2];
inline long long quickpow(long long a,long long b)
{
long long res = 1;
for ( ; b ; a = a * a , b>>=1 )
if ( 1 & b ) res = res * a;
return res;
}
inline void Prepdp(void)
{
for (int i=0;i<=9;i++) f[1][i][i] = 1;
for (int i=2;i<=12;i++)
for (int j=0;j<=9;j++)
{
for (int k=0;k<=9;k++)
for (int l=0;l<=9;l++)
f[i][j][l] += f[i-1][k][l];
f[i][j][j] += quickpow( 10 , i-1 );
}
}
inline void solve(long long x,int id)
{
memset( num , 0 , sizeof num );
cnt = 0; long long y = x;
while ( x ) num[++cnt] = x % 10 , x /= 10;
for (int i=0;i<cnt;i++)
for (int j=1;j<=9;j++)
for (int k=0;k<=9;k++)
ans[k][id] += f[i][j][k];
for (int i=cnt;i>=1;i--)
{
for (int j=0;j<num[i];j++)
{
if ( i == cnt && j == 0 ) continue;
for (int k=0;k<=9;k++)
ans[k][id] += f[i][j][k];
}
ans[num[i]][id] += y % quickpow( 10 , i-1 ) + 1;
}
}
int main(void)
{
Prepdp();
long long a,b;
while ( scanf("%lld%lld",&a,&b) && a && b )
{
solve( a-1 , 0 ) , solve( b , 1 );
for (int i=0;i<=9;i++)
printf("%lld%c",ans[i][1]-ans[i][0]," \n"[i==9]);
memset( ans , 0 , sizeof ans );
}
return 0;
}

<后记>

『The Counting Problem 数位dp』的更多相关文章

  1. UVA - 1640 The Counting Problem (数位dp)

    题意:统计l-r中每种数字出现的次数 很明显的数位dp问题,虽然有更简洁的做法但某人已经习惯了数位dp的风格所以还是选择扬长避短吧(说白了就是菜啊) 从高位向低位走,设状态$(u,lim,ze)$表示 ...

  2. POJ2282:The Counting Problem(数位DP)

    Description Given two integers a and b, we write the numbers between a and b, inclusive, in a list. ...

  3. 『月之谜 数位dp』

    月之谜 Description 打败了Lord lsp 之后,由 于lqr 是一个心地善良的女孩 子,她想净化Lord lsp 黑化的 心,使他变回到原来那个天然 呆的lsp--在倒霉的光之英 雄ap ...

  4. hdu 5106 Bits Problem(数位dp)

    题目链接:hdu 5106 Bits Problem 题目大意:给定n和r,要求算出[0,r)之间全部n-onebit数的和. 解题思路:数位dp,一个ct表示个数,dp表示和,然后就剩下普通的数位d ...

  5. hiho1259 A Math Problem (数位dp)

    题目链接:http://hihocoder.com/problemset/problem/1259 题目大意:g(t)=(f(i)%k=t)的f(i)的个数 求所有的(0-k-1)的g(i)的异或总值 ...

  6. 哈尔滨工程大学ACM预热赛 G题 A hard problem(数位dp)

    链接:https://ac.nowcoder.com/acm/contest/554/G Now we have a function f(x): int f ( int x ) {     if ( ...

  7. nowcoder A hard problem /// 数位DP

    题目大意: 称一个数x的各个数位之和为f(x) 求区间L R之间 有多少个数x%f(x)==0 #include <bits/stdc++.h> using namespace std; ...

  8. 『最长等差数列 线性DP』

    最长等差数列(51nod 1055) Description N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 6 8 9 10 12 13 14 等差子数列包括(仅包括两项的不 ...

  9. 『快乐链覆盖 树形dp』

    快乐链覆盖 Description 给定一棵 n 个点的树,你需要找至多 k 条互不相交的路径,使得它们的长度之和最大 定义两条路径是相交的:当且仅当存在至少一个点,使得这个点在两条路径中都出现 定义 ...

随机推荐

  1. .net core入门-跨域访问配置

    Asp.net Core 跨域配置   一般情况WebApi都是跨域请求,没有设置跨域一般会报以下错误 No 'Access-Control-Allow-Origin' header is prese ...

  2. LabVIEW工控二进制数据存储

    在文件存储的逻辑上,二进制文件基于值编码,而不是字符编码,其占用空间小,读取/写入速度快,但是译码比较复杂,不利用数据共享.根据具体编码方式的不同,二进制的使用方式也有所不同,如对bmp格式,规定了文 ...

  3. find命令通过排序只保留最新的文件目录

    find /usr/local/canal/logs/example -type d -name "*-*" | sort -nr | awk '{if (NR>=2){pr ...

  4. vue-cli3和element做一个简单的登陆页面

    1.先用vue-cli3创建一个项目 2.安装element模块 全局安装 npm i element-ui -S 3在main.js引入模块 import ElementUI from 'eleme ...

  5. Java 静态工厂模式的使用

    多相关文章请参考:http://www.enjoytoday.cn/categorys/java 静态工厂模式给人的第一印象就是:static+abstract.这两个词汇已经说明了一切,一个是周期长 ...

  6. linux基础学习(二)ls命令以及文件访问权限例(-rw-r-r--)

    ls命令 |命令选项|作用| |:-----:|:----:| |ll| 显示文件得详细信息| |ls -a |显示文件和隐藏文件| |ls -t|以文件和目录的更改时间排序| |ls -m|用&qu ...

  7. liteos 异常接管(十五)

    1 概述 1.1 基本概念 异常接管是操作系统对在运行期间发生异常的情况进行处理的一系列动作,譬如打印异常发生时当前函数调用栈信息. cpu现场信息.任务的堆栈情况等. 异常接管作为一种调测手段,可以 ...

  8. LR11录制手机/pad App脚本多种方法介绍(Mobile App补丁包)

    总体来说,通过LR录制手机脚本的方式有三种:1)通过代理方式录制,保证手机电脑在同一个网段:2)通过抓包录制,在手机上安装Mobile Recorder:3)通过安卓模拟器录制,本地安装android ...

  9. 花了快一天,才搞出来的一个client-go的demo

    用来直接获取所有service的annotaion里有ambassador的东东. 或者,watch集群事件. package main import ( "fmt" " ...

  10. 【cf375】D. Tree and Queries(dsu on tree+线段树)

    传送门 题意: 给出一颗以\(1\)为根的有根树,每个结点有个颜色\(c_i\). 之后要回答\(m\)组询问,每组询问包含\(v_i,k_i\),要回答以\(v_i\)为根的子树中,颜色出现次数不小 ...