The Counting Problem
询问区间\([a,b]\)中\(1\sim 9\)出现的次数,0 < a, b < 100000000。
解
显然为数位递推,考虑试填法,现在关键是求出方案数,于是设\(A[i]\)表示i位以内数字中0出现的次数,不含前导0,\(B[i]\)为i位数字中\(0\sim 9\)出现的次数,可以含前导0,不难有(其中\(base[i]=10^i\)),显然有
\]
\]
边界:\(A[0]=B[0]=0\)
解释:对于\(B[i]\),显然与第i位填什么有关,只能填0~9(含前导0),i-1位能够统计的数字个数翻10倍,然后对于第i位填上该个数字,剩下的数字自由组合有\(base[i-1]\),对于\(A[i]\),i-1位以内方案\(A[i-1]\),i位的方案是\(9B[i-1]\)(只能填\(1\sim 9\))。
于是对于一个数位题目,当我们处理好含前导0i位数字方案(前面的数字已经填好统计方案)和不含前导0i位以内的方案(前面的数字没有填好,不允许含前导0)的方程时,该题基本完成一半,罗嗦几句,帮助理解,对于\(1\sim 9\)的数字而言只需要\(B[i]\)数组即可,因为含前导0有两重意思都是等价的,一是i位数字上的含前导0的数的数字出现次数,二是i位以内的不含前导0的数的出现的次数,而0没有这个特殊待遇,于是得在维护一个\(A[i]\),剩下的照数位递推套路进行即可。
参考代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#define il inline
#define ri register
#define ll long long
#define swap(x,y) x^=y^=x^=y
using namespace std;
int num[9];
ll A[9],B[9],base[9],at[10],bt[10];
il void prepare();
il void ask(int n,ll[]);
int main(){
int a,b;prepare();
while(scanf("%d%d",&a,&b),a&&b){
if(a>b)swap(a,b);
ask(a-1,at),ask(b,bt);
for(int i(0);i<10;++i)
printf("%lld ",bt[i]-at[i]);
putchar('\n');
}
return 0;
}
il void ask(int n,ll ans[]){++n,num[0]&=0;
do num[++num[0]]=n%10,n/=10;while(n);
ans[0]=0;
for(int j(num[0]),k,l(0);j;--j){
for(k=0;k<num[j];++k)
ans[0]+=A[j-1]+base[j-1]*(l+!k);
if(!num[j])++l;
}ans[0]+=B[num[0]-1],ans[0]-=A[num[0]-1]+base[num[0]-1];
if(num[0]==1)++ans[0];
for(int i(1),j,k,l;i<10;++i)
for(j=num[0],l=ans[i]=0;j;--j){
for(k=0;k<num[j];++k){
ans[i]+=A[j-1]+base[j-1]*(l+(k==i));
}if(num[j]==i)++l;
}
}
il void prepare(){base[0]=1;
for(int i(1);i<9;++i)
base[i]=base[i-1]*10,A[i]=A[i-1]*10+base[i-1];B[1]=1;
for(int i(2);i<9;++i)B[i]=9*A[i-1]+B[i-1];
}
The Counting Problem的更多相关文章
- UVA 1640 The Counting Problem UVA1640 求[a,b]或者[b,a]区间内0~9在里面各个数的数位上出现的总次数。
/** 题目:UVA 1640 The Counting Problem UVA1640 链接:https://vjudge.net/problem/UVA-1640 题意:求[a,b]或者[b,a] ...
- 『The Counting Problem 数位dp』
The Counting Problem Description 求 [L,R]内每个数码出现的次数. Input Format 若干行,一行两个正整数 L 和 R. 最后一行 L=R=0,表示输入结 ...
- POJ2282 The Counting Problem
题意 Language:DefaultEspañol The Counting Problem Time Limit: 3000MS Memory Limit: 65536K Total Submis ...
- UVa 1640 - The Counting Problem(数论)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 1640 The Counting Problem
https://vjudge.net/problem/UVA-1640 题意:统计区间[l,r]中0——9的出现次数 数位DP 注意删除前导0 #include<cmath> #inclu ...
- [POJ 2282] The Counting Problem
[题目链接] http://poj.org/problem?id=2282 [算法] 数位DP [代码] #include <algorithm> #include <bitset& ...
- POJ2282:The Counting Problem(数位DP)
Description Given two integers a and b, we write the numbers between a and b, inclusive, in a list. ...
- UVa 1640 (计数) The Counting Problem
题意: 统计[a, b]或[b, a]中0~9这些数字各出现多少次. 分析: 这道题可以和UVa 11361比较来看. 同样是利用这样一个“模板”,进行区间的分块,加速运算. 因为这里没有前导0,所以 ...
- UVa 1640 The Counting Problem (数学,区间计数)
题意:给定两个数m, n,求从 m 到 n 中0-9数字各出现了多少次. 析:看起来挺简单的,其实并不好做,因为有容易想乱了.主要思路应该是这样的,分区间计数,先从个位进行计,一步一步的计算过来.都从 ...
随机推荐
- testNG官方文档翻译-3 testng.xml
你可以通过以下几种不同的方法触发TestNG: 用一个testng.xml文件 使用ant 从命令行触发 这个章节将会介绍testng.xml的格式(你也可以在下面找到关于ant和命令行的内容). 关 ...
- pycharm的第一次使用(其实并不是第一次)
file --> settings --> editor -->general --> change font size file --> settings --> ...
- mysql的索引方法btree和hash的区别
原文链接: http://www.91w.net/database/330.html 1. Hash索引: Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引 ...
- S1#Python之shebang
点1 - Python之shebang 一. shebang 在计算机科学中,Shebang是一个由井号和叹号构成的字符串行,其出现在文本文件的第一行的前两个字符. 在文件中存在Shebang的情况下 ...
- dev中 ,usercontrol打印界面内容,打印预览和打印
首先,在对应的文件夹下面添加引用,如下图 如果没有就下载下来包. 预先在本地文件夹下面建立.frx文件,像这样的, 然后在触发事件下面写 //打印预览 private void btn_Preview ...
- struts2类型转换1
概述 从一个 HTML 表单到一个 Action 对象, 类型转换是从字符串到非字符串. HTTP 没有 “类型” 的概念. 每一项表单输入只可能是一个字符串或一个字符串数组. 在服务器端, 必须把 ...
- 爬虫那些事儿--Http返回码
由于爬虫的抓取也是使用http协议交互.因此需要了解Http的各种返回码所代表的意义,才能判断爬虫的执行结果. 返回码如下: 100 Continue 初始的请求已经接受,客户应当继续发送请求的其余部 ...
- 笔记43 Spring Web Flow——订购披萨应用详解
一.项目的目录结构 二.订购流程总体设计 三.订购流程的详细设计 1.定义基本流程pizza-flow.xml <?xml version="1.0" encoding=&q ...
- 笔记30 视图解析 ——TilesViewResolver
Apache Tiles,定义适用于所有页面 的通用页面布局.Spring MVC以视图解析器的形式为Apache Tiles提 供了支持,这个视图解析器能够将逻辑视图名解析为Tile定义. 1.配 ...
- elementUI+JS实现全选与反选
在实际项目开发过程中,遇到的需求,需要实现全选以及取消全选等功能,主要使用ElementUI + JS来实现,具体代码如下: <!DOCTYPE html> <html lang=& ...