[ZJOI2010]数字计数

题目描述

给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。

输入输出格式

输入格式:

输入文件中仅包含一行两个整数a、b,含义如上所述。

输出格式:

输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次。

输入输出样例

输入样例#1:
1 99
输出样例#1:
9 20 20 20 20 20 20 20 20 20

说明

30%的数据中,a<=b<=10^6;

100%的数据中,a<=b<=10^12。

思路

这个题一看就是数位DP嘛;

所以,就乱搞一下就行了;

特别的,注意0的出现次数;

代码实现

 1 #include<cstdio>
 2 #define ll long long
 3 ll l,r;
 4 ll s[10];
 5 ll get(ll a,ll b){
 6        ll ret=0,i=1,j=b;
 7        for(ll i=1,j=b;j;j/=10,i*=10){
 8            ret+=(j/10+(j%10>a))*i;
 9            if(!a) ret-=i;
10            if(j%10==a) ret+=b%i+1;
11        }
12        return ret;
13 }
14 int main(){
15        scanf("%lld%lld",&l,&r);
16        for(int i=0;i<10;i++){
17            s[i]+=get(i,r)-get(i,l-1);
18            if(!i&&l==1) s[i]--;
19            printf("%lld ",s[i]);
20        }
21        putchar('\n');
22        return 0;
23 }

 

posted @ 2017-08-22 15:44  J_william  阅读(212)  评论(0编辑  收藏  举报