#include <iostream>
#include <cstdint>
#include <vector>
#include <map>
#include <array>
#include <memory>
namespace {
using uint_t = uint_fast32_t;
constexpr uint_t DEC = 10;
using counters_t = std::array<uint_t, DEC>;
using std::cout, std::cin;
using std::vector, std::map;
using std::unique_ptr, std::make_unique;
uint_t digit_product(uint_t ni) {
uint_t product = 1;
do {
product *= ni % DEC;
ni /= DEC;
} while (product > 0 && ni > 0);
return product;
}
}
int main() {
uint_t t, ni;
vector<uint_t> nis;
map<uint_t, unique_ptr<counters_t>> cnts;
vector<uint_fast8_t> digits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
cin >> t;
for (uint_t i = 0; i < t; ++i) {
cin >> ni;
nis.push_back(ni);
cnts.insert({ni, make_unique<counters_t>()});
if (ni >= digits.size()) {
for (uint_t j = digits.size(); j <= ni; ++j) {
digits.push_back(digits[digit_product(j)]);
}
}
}
if (cnts.rbegin()->first < DEC - 1) {
for (uint_t i = DEC - 1; i > cnts.rbegin()->first; --i)
digits.pop_back();
}
uint_t start = 1;
auto prev_it = cnts.begin();
for (auto it = cnts.begin(); it != cnts.end(); ++it) {
if (it != cnts.begin()) {
for (uint_t j = 0; j < DEC; ++j)
(*(it->second))[j] = (*(prev_it->second))[j];
}
for (uint_t k = start; k <= it->first; ++k) {
++(*(it->second))[digits[k]];
}
start = it->first + 1;
prev_it = it;
}
for (uint_t i = 0; i < t; ++i) {
for (uint_t j = 0; j < DEC; ++j) {
cout << (*cnts[nis[i]])[j];
if (j < DEC - 1) cout << ' ';
}
cout << '\n';
}
}
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 | #include <iostream> #include <cstdint> #include <vector> #include <map> #include <array> #include <memory> namespace { using uint_t = uint_fast32_t; constexpr uint_t DEC = 10; using counters_t = std::array<uint_t, DEC>; using std::cout, std::cin; using std::vector, std::map; using std::unique_ptr, std::make_unique; uint_t digit_product(uint_t ni) { uint_t product = 1; do { product *= ni % DEC; ni /= DEC; } while (product > 0 && ni > 0); return product; } } int main() { uint_t t, ni; vector<uint_t> nis; map<uint_t, unique_ptr<counters_t>> cnts; vector<uint_fast8_t> digits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; cin >> t; for (uint_t i = 0; i < t; ++i) { cin >> ni; nis.push_back(ni); cnts.insert({ni, make_unique<counters_t>()}); if (ni >= digits.size()) { for (uint_t j = digits.size(); j <= ni; ++j) { digits.push_back(digits[digit_product(j)]); } } } if (cnts.rbegin()->first < DEC - 1) { for (uint_t i = DEC - 1; i > cnts.rbegin()->first; --i) digits.pop_back(); } uint_t start = 1; auto prev_it = cnts.begin(); for (auto it = cnts.begin(); it != cnts.end(); ++it) { if (it != cnts.begin()) { for (uint_t j = 0; j < DEC; ++j) (*(it->second))[j] = (*(prev_it->second))[j]; } for (uint_t k = start; k <= it->first; ++k) { ++(*(it->second))[digits[k]]; } start = it->first + 1; prev_it = it; } for (uint_t i = 0; i < t; ++i) { for (uint_t j = 0; j < DEC; ++j) { cout << (*cnts[nis[i]])[j]; if (j < DEC - 1) cout << ' '; } cout << '\n'; } } |
English