[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 }