#include <bits/stdc++.h> using namespace std; typedef long long int ll; ll multiplicative_digital_root(ll x) { if (x / 10 == 0) { return x; } ll res = 1; while (x) { res *= x % 10; x /= 10; } return multiplicative_digital_root(res); } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while (t--) { string str; cin >> str; int max_digits = str.length(); unordered_map<ll, ll> dp[20][2][2]; int i, j; bool ignore = false; bool allow_any = true; for (i = 1; i <= 9; ++i) { if (!ignore && i > (str[0] - '0')) ignore = true; if (allow_any && i == (str[0] - '0')) allow_any = false; dp[1][ignore][allow_any][i] = 1; } bool started = false; for (i = 2; i <= max_digits; ++i) { for (int digit = 0; digit <= 9; ++digit) { for (int allow_any = 0; allow_any <= 1; ++allow_any) { for (int ignore = 0; ignore <= 1; ++ignore) { bool new_ignore = !allow_any && (ignore || (digit > (str[i - 1] - '0'))); bool new_allow_any = !ignore && (allow_any || digit < (str[i - 1] - '0')); for (auto& p : dp[i - 1][ignore][allow_any]) { ll new_product = p.first * digit; dp[i][new_ignore][new_allow_any][new_product] += p.second; } } } } } vector<ll> res(10, 0); ll mul; for (i = 1; i <= max_digits; ++i) { for (const auto& p : dp[i][0][1]) { mul = multiplicative_digital_root(p.first); res[mul] += p.second; } for (const auto& p : dp[i][0][0]) { mul = multiplicative_digital_root(p.first); res[mul] += p.second; } if (i != str.length()) { for (j = 0; j <= 1; ++j) { for (const auto& p : dp[i][1][j]) { mul = multiplicative_digital_root(p.first); res[mul] += p.second; } } } } for (i = 0; i < 10; ++i) { cout << res[i] << " "; } 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 | #include <bits/stdc++.h> using namespace std; typedef long long int ll; ll multiplicative_digital_root(ll x) { if (x / 10 == 0) { return x; } ll res = 1; while (x) { res *= x % 10; x /= 10; } return multiplicative_digital_root(res); } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while (t--) { string str; cin >> str; int max_digits = str.length(); unordered_map<ll, ll> dp[20][2][2]; int i, j; bool ignore = false; bool allow_any = true; for (i = 1; i <= 9; ++i) { if (!ignore && i > (str[0] - '0')) ignore = true; if (allow_any && i == (str[0] - '0')) allow_any = false; dp[1][ignore][allow_any][i] = 1; } bool started = false; for (i = 2; i <= max_digits; ++i) { for (int digit = 0; digit <= 9; ++digit) { for (int allow_any = 0; allow_any <= 1; ++allow_any) { for (int ignore = 0; ignore <= 1; ++ignore) { bool new_ignore = !allow_any && (ignore || (digit > (str[i - 1] - '0'))); bool new_allow_any = !ignore && (allow_any || digit < (str[i - 1] - '0')); for (auto& p : dp[i - 1][ignore][allow_any]) { ll new_product = p.first * digit; dp[i][new_ignore][new_allow_any][new_product] += p.second; } } } } } vector<ll> res(10, 0); ll mul; for (i = 1; i <= max_digits; ++i) { for (const auto& p : dp[i][0][1]) { mul = multiplicative_digital_root(p.first); res[mul] += p.second; } for (const auto& p : dp[i][0][0]) { mul = multiplicative_digital_root(p.first); res[mul] += p.second; } if (i != str.length()) { for (j = 0; j <= 1; ++j) { for (const auto& p : dp[i][1][j]) { mul = multiplicative_digital_root(p.first); res[mul] += p.second; } } } } for (i = 0; i < 10; ++i) { cout << res[i] << " "; } cout << "\n"; } return 0; } |