给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。
Input
输入文件中仅包含一行两个整数a、b,含义如上所述。
Output
输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次。
Sample Input
1 99
Sample Output
9 20 20 20 20 20 20 20 20 20
Hint
30%的数据中,a<=b<=10^6;
100%的数据中,a<=b<=10^12。
#include <cstdio>
#include <iostream>
#define ll long long
using namespace std;
ll ans[10],f[20];
inline void Resolve(ll x, ll pos) { while(x) ans[x%10] += pos, x /= 10; }
void Digital_DP(ll x, int flag) {
int i,j;
ll pos,now;
for(i = 1, pos = 10; pos < x; ++i, pos *= 10) {
for(j = 0; j <= 9; j++) ans[j] += f[i-1]*9*flag;
for(j = 1; j <= 9; j++) ans[j] += pos/10*flag;
}
now = pos /= 10; --i;
while(now < x) {
while(now+pos <= x) {
ll temp = now/pos;
Resolve(temp, pos*flag);
for(j = 0; j <= 9; j++) ans[j] += f[i]*flag;
now += pos;
}
pos /= 10; --i;
}
}
int main() {
int i;
ll a,b,pos;
f[1] = 1;
for(i = 2, pos = 10; i <= 12; i++, pos *= 10) f[i] = f[i-1]*10+pos;
cin >> a >> b;
Digital_DP(b+1, 1); Digital_DP(a, -1);
for(i = 0; i <= 9; i++) printf("%lld%c", ans[i], i == 9 ? '\n' : ' ');
return 0;
}