代码如下
```cpp
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
typedef long long LL;
LL f[17][10][10];//f[i][j][u] i位数,最高位为j,拥有的u的个数
void init()
{
for (int i = 0; i < 10; i ++ ) f[1][i][i] = 1;
for (int i = 2; i < 14; i ++ )
for (int j = 0; j < 10; j ++ )
for (int u = 0; u < 10; u ++ )
{
if (j == u) f[i][j][u] += pow(10, i - 1);
for (int k = 0; k < 10; k ++ )
f[i][j][u] += f[i - 1][k][u];
}
return;
}
LL dp(LL n, int u) //1~n中u出现的次数
{
if (!n) return (u == 0 ? 1 : 0);
vector<int> nums;
while (n)
{
nums.push_back(n % 10);
n /= 10;
}
int last = 0;
LL ans = 0;
for (int i = nums.size() - 1; i >= 0; i -- )
{
int x = nums[i];
for (int j = (i == nums.size() - 1); j < x; j ++ )
ans += f[i + 1][j][u];
ans += x * last * pow(10, i); //为什么要加这一句 (看我看我看我看我看我看我看我看我看我看我看我看我看我看我看我看我看我看我看我看我看我看我)
if (x == u) last ++ ;
if (!i) ans += last;
}
for (int i = 1; i < nums.size(); i ++ )
for (int j = (i != 1); j <= 9; j ++ )
ans += f[i][j][u];
return ans;
}
int main()
{
init();
LL a, b;
cin >> a >> b;
for (int i = 0; i <= 9; i ++ )
cout << dp(b, i) - dp(a - 1, i) << ' ';
return 0;
}
```
by LittleMoMol @ 2022-09-05 18:54:12
@[LittleMoMol](/user/590755)
应该是将最高位计入答案的意思
by Spaceswalker @ 2022-09-05 20:09:51