思路:
数位dp,先预处理dp数组,然后统计答案。
先计算位数小于当前位的,再枚举第一位,从
1
到最大值
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll n, m;
ll f[15][15][15], mi[15];
void init(){
mi[0] = 1;
for(int i = 1; i <= 14; i ++) mi[i] = mi[i-1] * 10;
for(int i = 0; i <= 9; i ++) f[1][i][i] = 1;
for(int i = 2; i <= 14; i ++){
for(int j = 0; j <= 9; j ++){
for(int k = 0; k <= 9; k ++){
if(j == k) f[i][j][k] += mi[i-1];
for(int l = 0; l <= 9; l ++){
f[i][j][k] += f[i-1][l][k];
}
}
}
}
}
ll calc(ll num, ll xx){
ll l = 0, a[20], res = 0; memset(a, 0, sizeof(a));
for(ll x = xx; x; x/=10) a[++ l] = x%10;
for(int i = 1; i < l; i ++)
for(int j = 1; j <= 9; j ++) res += f[i][j][num];
for(int i = 1; i < a[l]; i ++) res += f[l][i][num];
for(int i = l-1; i >= 1; i --)
for(int j = 0; j < a[i]; j ++) res += f[i][j][num];
for(int i = 1; i <= l; i ++) if(a[i] == num) res += xx%mi[i-1];
return res;
}
int main(){
init();
cin >> n >> m;
for(int i = 0; i <= 9; i ++) cout << calc(i, m+1)-calc(i, n) << (i==9?'\n':' ');
return 0;
}