#include <bits/stdc++.h>
using namespace std;
int run(long long n) {
if (n < 10) {
return n;
}
long long res = 1;
while (n > 0) {
res *= n % 10;
n /= 10;
}
return run(res);
}
void addAns(vector <long long> &ans, const vector <long long> &otherAns) {
for (int d = 0; d < 10; d++) {
ans[d] += otherAns[d];
}
}
map <pair<long long, int>, vector <long long>> cache;
vector <long long> rec(long long mul, int digits) {
vector <long long> ans(10, 0);
if (!digits) {
ans[run(mul)] = 1;
return ans;
}
if (mul % 10 == 0) {
ans[0] = 1;
while (digits--) {
ans[0] *= 10;
}
return ans;
}
pair <long long, int> p = {mul, digits};
auto it = cache.find(p);
if (it != cache.end()) {
return it->second;
}
for (int d = 0; d < 10; d++) {
addAns(ans, rec(mul * d, digits - 1));
}
return cache[p] = ans;
}
vector <int> getDigits(long long n) {
vector <int> digits;
while (n > 0) {
digits.push_back(n % 10);
n /= 10;
}
reverse(digits.begin(), digits.end());
return digits;
}
vector <long long> solve(long long n) {
auto digits = getDigits(n + 1);
vector <long long> ans(10, 0);
for (int i = 1; i < digits.size(); i++) {
for (int d = 1; d < 10; d++) {
addAns(ans, rec(d, i - 1));
}
}
long long mul = 1;
for (int i = 0; i < digits.size(); i++) {
for (int d = 0; d < digits[i]; d++) {
if (i == 0 && d == 0) {
continue;
}
addAns(ans, rec(mul * d, (int) digits.size() - i - 1));
}
mul *= digits[i];
}
return ans;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
int t;
cin >> t;
while (t--) {
long long n;
cin >> n;
auto ans = solve(n);
for (int d = 0; d < 10; d++) {
cout << ans[d] << ' ';
}
cout << '\n';
}
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | #include <bits/stdc++.h> using namespace std; int run(long long n) { if (n < 10) { return n; } long long res = 1; while (n > 0) { res *= n % 10; n /= 10; } return run(res); } void addAns(vector <long long> &ans, const vector <long long> &otherAns) { for (int d = 0; d < 10; d++) { ans[d] += otherAns[d]; } } map <pair<long long, int>, vector <long long>> cache; vector <long long> rec(long long mul, int digits) { vector <long long> ans(10, 0); if (!digits) { ans[run(mul)] = 1; return ans; } if (mul % 10 == 0) { ans[0] = 1; while (digits--) { ans[0] *= 10; } return ans; } pair <long long, int> p = {mul, digits}; auto it = cache.find(p); if (it != cache.end()) { return it->second; } for (int d = 0; d < 10; d++) { addAns(ans, rec(mul * d, digits - 1)); } return cache[p] = ans; } vector <int> getDigits(long long n) { vector <int> digits; while (n > 0) { digits.push_back(n % 10); n /= 10; } reverse(digits.begin(), digits.end()); return digits; } vector <long long> solve(long long n) { auto digits = getDigits(n + 1); vector <long long> ans(10, 0); for (int i = 1; i < digits.size(); i++) { for (int d = 1; d < 10; d++) { addAns(ans, rec(d, i - 1)); } } long long mul = 1; for (int i = 0; i < digits.size(); i++) { for (int d = 0; d < digits[i]; d++) { if (i == 0 && d == 0) { continue; } addAns(ans, rec(mul * d, (int) digits.size() - i - 1)); } mul *= digits[i]; } return ans; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int t; cin >> t; while (t--) { long long n; cin >> n; auto ans = solve(n); for (int d = 0; d < 10; d++) { cout << ans[d] << ' '; } cout << '\n'; } return 0; } |
English