F2.cpp 881 B

1234567891011121314151617181920212223242526272829303132333435
  1. #include <cstdio>
  2. #include <cstring>
  3. #define rr register
  4. using namespace std;
  5. using ll=long long;
  6. ll dp[15][15], l, r;
  7. int dig[15];
  8. inline ll dfs(int dep, bool lim, bool ahe, int now, int sum) {
  9. rr ll ans = 0;
  10. if (!dep) return sum;
  11. if (!lim && ahe && dp[dep][sum] != -1) return dp[dep][sum];
  12. rr int mx = lim ? dig[dep] : 9;
  13. for (rr int i = 0; i <= mx; ++i)
  14. ans += dfs(dep - 1, lim && (i == mx), ahe || i, now, sum + ((ahe || i) && (i == now)));
  15. if (!lim && ahe) dp[dep][sum] = ans;
  16. return ans;
  17. }
  18. inline ll answ(ll x, int now) {
  19. memset(dp, -1, sizeof(dp));
  20. rr int len = 0;
  21. while (x)
  22. dig[++len] = x % 10, x /= 10;
  23. return dfs(len, 1, 0, now, 0);
  24. }
  25. signed main() {
  26. l = 1;
  27. scanf("%d", &r);
  28. for (rr int i = 0; i < 10; ++i)
  29. printf("%lld%c", answ(r, i) - answ(l - 1, i), i == 9 ? 10 : 32);
  30. return 0;
  31. }