题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1833
仍然是数位dp
#include<iostream> #include<cstdio> #include<cstring> #define LL long long using namespace std; const int MAXN = 20; LL f[MAXN][MAXN][MAXN],ans[MAXN],p[MAXN]; inline void prework(){ p[0] = 1; p[1] = 10; for (int i=2;i<=12;i++) p[i] = p[i-1]*10; for (int i=0;i<=9;i++) f[1][i][i] = 1; for (int k=2;k<=12;k++) { for (int i=0;i<=9;i++) { for (int j=0;j<=9;j++) { for (int h=0;h<=9;h++) { f[k][i][h] += f[k-1][j][h]; } } f[k][i][i] += p[k-1]; } } } inline void cal(LL w, int t){ if (!w) return; else { int tot = 0, arr[20]; LL tmp = w; memset(arr,0,sizeof(arr)); while (w) arr[++tot] = w % 10, w /= 10; for (int i=tot-1;i;i--) for (int j=1;j<=9;j++) for (int k=0;k<=9;k++) ans[k] += f[i][j][k]*t; for (int i=tot;i;i--) { for (int j=(i==tot?1:0);j<=arr[i]-(i==1?0:1);j++) for (int k=0;k<=9;k++) ans[k] += f[i][j][k]*t; if (i>1) ans[arr[i]] += (tmp % p[i-1] + 1)*t; } } } int main(){ prework(); LL a,b; cin>>a>>b; cal(b,1); cal(a-1,-1); for (int i=0;i<9;i++) printf("%lld ", ans[i]); printf("%lld",ans[9]); return 0; }