#include <iostream> #include <vector> #include <numeric> #include <cstdlib> #include <functional> #include <string> #include <array> #include <chrono> #include <map> constexpr static int64_t CYFR = 10; typedef std::array<int64_t,CYFR> LicznoscCyfr; template<class T> static void wypisz(const T &v, std::ostream &str=std::cerr) { for (auto it = std::begin(v); it != std::end(v); ++it) { str << *it << " "; } } constexpr static int64_t silnia(int64_t n) { int64_t wynik = 1; for (int64_t i = 2; i <= n; ++i) { wynik *= i; } return wynik; } constexpr static int64_t silnia_tab[] = { silnia(0), silnia(1), silnia(2), silnia(3), silnia(4), silnia(5), silnia(6), silnia(7), silnia(8), silnia(9), silnia(10), silnia(11), silnia(12), silnia(13), silnia(14), silnia(15), silnia(16), silnia(17), silnia(18), silnia(19), }; constexpr static LicznoscCyfr pelneBloki[] = { {0}, {0}, {0,1,1,1,1,1,1,1,1,1}, {24, 2, 9, 3, 10, 7, 14, 3, 23, 4, }, {476, 3, 77, 6, 65, 40, 155, 6, 161, 10, }, {6739, 4, 543, 10, 279, 172, 1172, 10, 1050, 20, }, {82401, 5, 3213, 15, 894, 607, 6843, 15, 5971, 35, }, {902608, 6, 16673, 21, 2345, 2073, 43538, 21, 32658, 56, }, {9394517, 7, 86093, 28, 6174, 7414, 318457, 28, 187197, 84, }, {96122290, 8, 503815, 36, 66354, 26070, 2223803, 36, 1057467, 120, }, {975700392, 9, 3529057, 45, 1005399, 84099, 14185700, 45, 5495088, 165, }, {9854082822, 10, 25402097, 55, 9737884, 243529, 84670477, 55, 25862850, 220, }, {99180099587, 11, 162303510, 66, 66699415, 636130, 477808607, 66, 112452321, 286, }, {995679223590, 12, 884504882, 78, 356586629, 1518166, 2577052118, 78, 501114082, 364, }, {9977627937023, 13, 4156234265, 91, 1585685916, 3354325, 13759255632, 91, 2867532188, 455, }, {99879659224379, 14, 17270407962, 105, 6342292785, 6940831, 75251167843, 105, 21469965415, 560, }, {999321444658475, 15, 65375131342, 120, 30560724590, 13579716, 418157757456, 120, 164448147485, 680, }, {9996118748668338, 16, 232901619970, 136, 264486626166, 25318372, 2267313716636, 136, 1116524049413, 816, }, {99978099721506172, 17, 807191392546, 153, 2926013859615, 45270813, 11616142299625, 153, 6550885669936, 969, }, {999879067589400315, 18, 2795912956450, 171, 28611339267816, 78039555, 55909713312571, 171, 33615367021792, 1140, }, }; /* static void kombinacjeZPowtorzeniami( int64_t n, int64_t k, std::function<void(LicznoscCyfr&)> cb ) { // std::cerr << "KzP " << n << " " << k << std::endl; LicznoscCyfr licznosc{0}; std::vector<int> indeksy(k); licznosc[0] = k; for (;;) { cb(licznosc); int i = k-1; for (i = k-1; 0 <= i; --i) { if (indeksy[i] != n-1) { break; } } if (i == -1) { return; } int w = indeksy[i] + 1; for (int j = i; j < k; ++j) { --licznosc[indeksy[j]]; indeksy[j] = w; ++licznosc[indeksy[j]]; } } } */ static int64_t mnoz_rek(int64_t liczba) { if (liczba <= 9) { return liczba; } int64_t iloczyn = 1; while (liczba) { auto iloraz = std::lldiv(liczba, 10); iloczyn *= iloraz.rem; liczba = iloraz.quot; } return mnoz_rek(iloczyn); } static int64_t mnoz_iter(int64_t liczba) { while (9 < liczba) { int64_t iloczyn = 1; while (liczba) { auto iloraz = std::lldiv(liczba, 10); if (iloraz.rem == 0) { return 0; } iloczyn *= iloraz.rem; liczba = iloraz.quot; } liczba = iloczyn; } return liczba; } static auto mnoz_l = mnoz_iter; static int64_t mnoz(const LicznoscCyfr &licznoscCyfr) { int64_t iloczynCyfr = 1; for (size_t i = 0; i < CYFR; ++i) { for (int j = 0; j < licznoscCyfr[i]; ++j) { iloczynCyfr *= i; } } return mnoz_l(iloczynCyfr); } static int64_t zliczPowtorzenia(const LicznoscCyfr &licznoscCyfr) { int64_t licznik = 0; int64_t mianownik = 1; for (size_t i = 0; i < CYFR; ++i) { if (licznoscCyfr[i]) { licznik += licznoscCyfr[i]; mianownik *= silnia_tab[licznoscCyfr[i]]; } } licznik = silnia_tab[licznik]; return licznik / mianownik; } void dodaj(LicznoscCyfr & a, const LicznoscCyfr &b) { for (int i = 0; i < CYFR; ++i) { a[i] += b[i]; } } void zPoczatkiem(const int k, std::string zapis, LicznoscCyfr &wynik) { static std::map<std::pair<int,std::string>,LicznoscCyfr> czescioweBloki{ {{4, "2"}, {7263, 1, 466, 4, 214, 132, 1017, 4, 889, 10, }}, {{4, "3"}, {15176, 1, 819, 4, 312, 132, 1937, 4, 1605, 10, }}, {{4, "4"}, {23107, 1, 1293, 5, 422, 206, 2550, 4, 2398, 14, }}, {{4, "5"}, {31538, 1, 1549, 5, 459, 206, 3266, 4, 2958, 14, }}, {{4, "6"}, {41413, 1, 1549, 5, 459, 331, 3266, 4, 2958, 14, }}, {{4, "7"}, {49893, 1, 1873, 5, 501, 331, 3817, 4, 3561, 14, }}, {{4, "8"}, {58383, 1, 2031, 5, 569, 395, 4668, 5, 3929, 14, }}, {{4, "9"}, {67236, 1, 2235, 5, 579, 395, 5217, 5, 4313, 14, }}, {{5, "2"}, {85662, 1, 2670, 5, 615, 435, 5671, 5, 4921, 15, }}, {{5, "3"}, {174858, 1, 4567, 5, 845, 435, 10546, 5, 8723, 15, }}, {{5, "4"}, {263919, 1, 6868, 6, 1090, 680, 14777, 5, 12634, 20, }}, {{5, "5"}, {355364, 1, 8224, 6, 1161, 680, 18915, 5, 15624, 20, }}, {{5, "6"}, {454983, 1, 8224, 6, 1161, 1061, 18915, 5, 15624, 20, }}, {{5, "7"}, {545991, 1, 9729, 6, 1241, 1061, 23291, 5, 18655, 20, }}, {{5, "8"}, {637293, 1, 10344, 6, 1376, 1306, 28132, 6, 21516, 20, }}, {{5, "9"}, {730010, 1, 11399, 6, 1391, 1306, 31829, 6, 24032, 20, }}, {{6, "2"}, {920207, 1, 13460, 6, 1451, 1466, 36695, 6, 26687, 21, }}, {{6, "3"}, {1853981, 1, 22988, 6, 1913, 1466, 70934, 6, 48684, 21, }}, {{6, "4"}, {2783688, 1, 34409, 7, 2384, 2417, 108095, 6, 68966, 27, }}, {{6, "5"}, {3726391, 1, 41435, 7, 2565, 2417, 139054, 6, 88097, 27, }}, {{6, "6"}, {4725198, 1, 41435, 7, 2565, 3610, 139054, 6, 88097, 27, }}, {{6, "7"}, {5663690, 1, 49501, 7, 2820, 3610, 175199, 6, 105139, 27, }}, {{6, "8"}, {6608401, 1, 52224, 7, 3176, 4681, 206856, 7, 124620, 27, }}, {{6, "9"}, {7557700, 1, 57906, 7, 3557, 4681, 234332, 7, 141782, 27, }}, {{7, "2"}, {9491909, 1, 69420, 7, 3829, 5341, 274919, 7, 154539, 28, }}, {{7, "3"}, {19053743, 1, 121844, 7, 7917, 5341, 523993, 7, 287119, 28, }}, {{7, "4"}, {28591924, 1, 187693, 8, 12516, 8911, 802565, 7, 396340, 35, }}, {{7, "5"}, {38209981, 1, 231353, 8, 20896, 8911, 1018424, 7, 510384, 35, }}, {{7, "6"}, {48206452, 1, 231353, 8, 20896, 12440, 1018424, 7, 510384, 35, }}, {{7, "7"}, {57807359, 1, 284743, 8, 29926, 12440, 1262340, 7, 603141, 35, }}, {{7, "8"}, {67467577, 1, 305281, 8, 37129, 16437, 1462330, 8, 711194, 35, }}, {{7, "9"}, {77133711, 1, 346357, 8, 52697, 16437, 1645618, 8, 805128, 35, }}, {{8, "2"}, {96727773, 1, 417722, 8, 60180, 18656, 1905346, 8, 870270, 36, }}, {{8, "3"}, {193911227, 1, 783246, 8, 162256, 18656, 3534228, 8, 1590334, 36, }}, {{8, "4"}, {291037324, 1, 1226714, 9, 254356, 30172, 5299272, 8, 2152100, 44, }}, {{8, "5"}, {388607927, 1, 1577026, 9, 408077, 30172, 6653804, 8, 2722932, 44, }}, {{8, "6"}, {488598502, 1, 1577026, 9, 408077, 39597, 6653804, 8, 2722932, 44, }}, {{8, "7"}, {586147156, 1, 1977681, 9, 544521, 39597, 8114223, 8, 3176760, 44, }}, {{8, "8"}, {684025742, 1, 2231308, 9, 648353, 51869, 9356027, 9, 3686638, 44, }}, {{8, "9"}, {781955697, 1, 2577788, 9, 845789, 51869, 10464393, 9, 4104401, 44, }}, {{9, "2"}, {979578102, 1, 3025242, 9, 939045, 58029, 11961897, 9, 4437621, 45, }}, {{9, "3"}, {1962241866, 1, 5886406, 9, 2176527, 58029, 21788253, 9, 7848855, 45, }}, {{9, "4"}, {2945160737, 1, 8936809, 10, 3151272, 89898, 32135965, 9, 10525245, 54, }}, {{9, "5"}, {3930679130, 1, 11653576, 10, 4583029, 89898, 40014583, 9, 12979710, 54, }}, {{9, "6"}, {4930656479, 1, 11653576, 10, 4583029, 112549, 40014583, 9, 12979710, 54, }}, {{9, "7"}, {5916513650, 1, 14390677, 10, 5718469, 112549, 48290552, 9, 14974029, 54, }}, {{9, "8"}, {6903379516, 1, 16859191, 10, 6590950, 144670, 55885214, 10, 17140384, 54, }}, {{9, "9"}, {7891676275, 1, 19325158, 10, 8042767, 144670, 62053925, 10, 18757130, 54, }}, {{10, "2"}, {9878382430, 1, 21873040, 10, 8732485, 159430, 70484777, 10, 20367762, 55, }}, {{10, "3"}, {19778908524, 1, 41748973, 10, 18107625, 159430, 126257547, 10, 34817825, 55, }}, {{10, "4"}, {29683777889, 1, 60298845, 11, 24854110, 237095, 184257126, 10, 46574848, 65, }}, {{10, "5"}, {39604993054, 1, 77524692, 11, 33838451, 237095, 227215608, 10, 56191013, 65, }}, {{10, "6"}, {49604943473, 1, 77524692, 11, 33838451, 286676, 227215608, 10, 56191013, 65, }}, {{10, "7"}, {59530214096, 1, 92994712, 11, 40431356, 286676, 271795453, 10, 64277620, 65, }}, {{10, "8"}, {69455424423, 1, 110499636, 11, 45608556, 360981, 314860371, 11, 73245945, 65, }}, {{10, "9"}, {79395087992, 1, 124404886, 11, 53276971, 360981, 347479736, 11, 79389346, 65, }}, {{11, "2"}, {99326016765, 1, 136901413, 11, 56961531, 392601, 393138130, 11, 86589471, 66, }}, {{11, "3"}, {198800421551, 1, 250931132, 11, 109245488, 392601, 693167684, 11, 145841455, 66, }}, {{11, "4"}, {298309356910, 1, 346368661, 12, 144443519, 563552, 1003029137, 11, 196238120, 77, }}, {{11, "5"}, {397908972055, 1, 435333141, 12, 187760035, 563552, 1229573357, 11, 237797759, 77, }}, {{11, "6"}, {497908871767, 1, 435333141, 12, 187760035, 663840, 1229573357, 11, 237797759, 77, }}, {{11, "7"}, {597538303282, 1, 507992013, 12, 217743285, 663840, 1461421623, 11, 273875856, 77, }}, {{11, "8"}, {697143371743, 1, 605076573, 12, 241898966, 819941, 1687273777, 12, 321558898, 77, }}, {{11, "9"}, {796838598701, 1, 669496962, 12, 274166597, 819941, 1861846087, 12, 355071610, 77, }}, {{12, "2"}, {996499124003, 1, 722201372, 12, 289887214, 882036, 2099243511, 12, 388661761, 78, }}, {{12, "3"}, {1993825074064, 1, 1270328437, 12, 524472292, 882036, 3684864563, 12, 694378505, 78, }}, {{12, "4"}, {2991369413583, 1, 1690136498, 13, 674385826, 1228746, 5306801133, 12, 958034098, 90, }}, {{12, "5"}, {3989304058897, 1, 2079025043, 13, 847110731, 1228746, 6529219257, 12, 1239357210, 90, }}, {{12, "6"}, {4989303869012, 1, 2079025043, 13, 847110731, 1418631, 6529219257, 12, 1239357210, 90, }}, {{12, "7"}, {5987432489274, 1, 2371632117, 13, 961448141, 1418631, 7755753173, 12, 1477258548, 90, }}, {{12, "8"}, {6985310749710, 1, 2818246210, 13, 1055992053, 1722375, 8947442795, 13, 1865846740, 90, }}, {{12, "9"}, {7983649058495, 1, 3077043738, 13, 1171879155, 1722375, 9932833512, 13, 2167462608, 90, }}, {{13, "2"}, {9981948713433, 1, 3271729383, 13, 1229099287, 1836159, 11182203514, 13, 2366418106, 91, }}, {{13, "3"}, {19967785226302, 1, 5557262621, 13, 2132499837, 1836159, 19820117344, 13, 4703057619, 91, }}, {{13, "4"}, {29954996620796, 1, 7177233909, 14, 2691849758, 2493920, 28543244107, 13, 6588557378, 104, }}, {{13, "5"}, {39943452920822, 1, 8685632138, 14, 3321278013, 2493920, 35435256208, 13, 9102418767, 104, }}, {{13, "6"}, {49943452580689, 1, 8685632138, 14, 3321278013, 2834053, 35435256208, 13, 9102418767, 104, }}, {{13, "7"}, {59933269579535, 1, 9733162206, 14, 3738999993, 2834053, 42196577152, 13, 11058846929, 104, }}, {{13, "8"}, {69921020801811, 1, 11507092858, 14, 4078754681, 3389426, 48946621336, 14, 14443339755, 104, }}, {{13, "9"}, {79911143412574, 1, 12469336348, 14, 4538058045, 3389426, 54627204712, 14, 17218598762, 104, }}, {{14, "2"}, {99902031287356, 1, 13114173697, 14, 4756606869, 3586506, 61491912211, 14, 18602433227, 105, }}, {{14, "3"}, {199821672997388, 1, 21720278037, 14, 8425513957, 3586506, 110020019269, 14, 38157604709, 105, }}, {{14, "4"}, {299750937350083, 1, 27367852648, 15, 10850212520, 4767245, 158286324475, 14, 52553492880, 119, }}, {{14, "5"}, {399682637001803, 1, 32851722664, 15, 14221319715, 4767245, 197184570176, 14, 73100618248, 119, }}, {{14, "6"}, {499682636420466, 1, 32851722664, 15, 14221319715, 5348582, 197184570176, 14, 73100618248, 119, }}, {{14, "7"}, {599624653739182, 1, 36319500525, 15, 16791100474, 5348582, 234409954478, 14, 87820356610, 119, }}, {{14, "8"}, {699552527687930, 1, 42574404740, 15, 18405658706, 6313105, 273717775863, 15, 112768159506, 119, }}, {{14, "9"}, {799492337241424, 1, 46140961384, 15, 22535330357, 6313105, 305153586675, 15, 133826566905, 119, }}, {{15, "2"}, {999441785434096, 1, 48104723380, 15, 24218431805, 6638885, 342906589613, 15, 142978182070, 120, }}, {{15, "3"}, {1998972180424461, 1, 78720252234, 15, 51938779910, 6638885, 610837899253, 15, 286316005106, 120, }}, {{15, "4"}, {2998573822753512, 1, 97086573627, 16, 72954155495, 8662145, 872342511637, 15, 383785343417, 135, }}, {{15, "5"}, {3998167733253276, 1, 116898215695, 16, 111227825571, 8662145, 1080796999359, 15, 523335043787, 135, }}, {{15, "6"}, {4998167732298725, 1, 116898215695, 16, 111227825571, 9616696, 1080796999359, 15, 523335043787, 135, }}, {{15, "7"}, {5997839285717131, 1, 127985860185, 16, 141885895356, 9616696, 1274339767990, 15, 616493142475, 135, }}, {{15, "8"}, {6997435663246838, 1, 147960323755, 16, 156506259161, 11220901, 1491602104290, 16, 768256844887, 135, }}, {{15, "9"}, {7997072526725793, 1, 161877113715, 16, 212690197091, 11220901, 1653588538484, 16, 899306203848, 135, }}, {{16, "2"}, {9996797304009863, 1, 167526488628, 16, 233925901576, 11738656, 1849155959180, 16, 952075901928, 136, }}, {{16, "3"}, {19994077975350304, 1, 275249685899, 16, 565409606928, 11738656, 3243028341380, 16, 1838325276664, 136, }}, {{16, "4"}, {29991879647632435, 1, 332918429911, 17, 815888870664, 15071032, 4568980291472, 16, 2402549704300, 152, }}, {{16, "5"}, {39989498699614956, 1, 407034590035, 17, 1284059901865, 15071032, 5611269301448, 16, 3198921520478, 152, }}, {{16, "6"}, {49989498698100843, 1, 407034590035, 17, 1284059901865, 16585145, 5611269301448, 16, 3198921520478, 152, }}, {{16, "7"}, {59987678582177207, 1, 442713967986, 17, 1640042949745, 16585145, 6539199727929, 16, 3699444591802, 152, }}, {{16, "8"}, {69985587909072076, 1, 501357542916, 17, 1796603368801, 19156761, 7633362104901, 17, 4480748754358, 152, }}, {{16, "9"}, {79983420392463347, 1, 558486251012, 17, 2427387843257, 19156761, 8423196145209, 17, 5170518140227, 152, }}, {{17, "2"}, {99981980972837834, 1, 574289772576, 17, 2661527233449, 19952441, 9348828582989, 17, 5434361620523, 153, }}, {{17, "3"}, {199966522889980769, 1, 961448206995, 17, 6251487635107, 19952441, 16130571530841, 17, 10133582693659, 153, }}, {{17, "4"}, {299954741596171382, 1, 1142000239324, 18, 8820909980356, 25256866, 22333130196133, 17, 12962338155733, 170, }}, {{17, "5"}, {399940967528339556, 1, 1429637250877, 18, 13411493270621, 25256866, 27303684755420, 17, 16887631126454, 170, }}, {{17, "6"}, {499940967526009025, 1, 1429637250877, 18, 13411493270621, 27587397, 27303684755420, 17, 16887631126454, 170, }}, {{17, "7"}, {599931071578518281, 1, 1547961968139, 18, 16701164640141, 27587397, 31449598403068, 17, 19229668882768, 170, }}, {{17, "8"}, {699920974043476780, 1, 1708107787154, 18, 18128127154706, 31580918, 36458765045032, 18, 22730924955203, 170, }}, {{17, "9"}, {799908216902297931, 1, 1944546499844, 18, 23646158965631, 31580918, 40292317674601, 18, 25900042980868, 170, }}, {{18, "2"}, {999900967867894143, 1, 1988721563904, 18, 25685325408201, 32768742, 44293571012946, 18, 27064481351856, 171, }}, {{18, "3"}, {1999814646636797919, 1, 3416180322598, 18, 57057287334801, 32768742, 75904783654536, 18, 48975079121196, 171, }}, {{18, "4"}, {2999753114925096075, 1, 3991414496500, 19, 78339474448818, 40965123, 103007160518823, 18, 61546984474434, 189, }}, {{18, "5"}, {3999674931531568218, 1, 5115811502536, 19, 114475755036751, 40965123, 126710183981970, 18, 78766676945175, 189, }}, {{18, "6"}, {4999674931528074477, 1, 5115811502536, 19, 114475755036751, 44458864, 126710183981970, 18, 78766676945175, 189, }}, {{18, "7"}, {5999622204480934815, 1, 5518760744380, 19, 139077040529212, 44458864, 144593598169639, 18, 88606075162863, 189, }}, {{18, "8"}, {6999575748823320178, 1, 5929335085525, 19, 149785017657988, 50491213, 165949786322977, 19, 102586987121891, 189, }}, {{18, "9"}, {7999502835874529134, 1, 6875184168781, 19, 188974161292423, 50491213, 185510518365538, 19, 115804211152683, 189, }}, }; // std::cerr << "P " << k << " " << zapis << "\n"; if (auto znany = czescioweBloki.find({k, zapis}); znany != czescioweBloki.end()) { dodaj(wynik, znany->second); // std::cerr << "."; return; } // std::cerr << k << " - " << zapis << "\n"; const size_t j = zapis.size()-1; LicznoscCyfr licznoscCyfr{0}; licznoscCyfr[0] = k; std::vector<int> indeksy(k); LicznoscCyfr licznosc{0}; licznosc[0] = k; for (size_t m = 0; m < j; ++m) { ++licznosc[zapis[m]-'0']; } for (;;) { { int64_t powtorzen = zliczPowtorzenia(licznoscCyfr); for (int p = (j==0 ? 1 : 0); p < (zapis[j]-'0'); ++p) { ++licznosc[p]; int cyfraWyniku = (licznosc[0] || (licznosc[5] && (licznosc[2] || licznosc[4] || licznosc[6] || licznosc[8]))) ? 0 : mnoz(licznosc); wynik[cyfraWyniku] += powtorzen; --licznosc[p]; } } int i = k-1; for (i = k-1; 0 <= i; --i) { if (indeksy[i] != CYFR-1) { break; } } if (i == -1) { break; } int w = indeksy[i] + 1; for (int j = i; j < k; ++j) { --licznosc[indeksy[j]]; --licznoscCyfr[indeksy[j]]; indeksy[j] = w; ++licznosc[indeksy[j]]; ++licznoscCyfr[indeksy[j]]; } } if (zapis.size() <= 4) { czescioweBloki.insert({{k, zapis}, {wynik}}); } } /* * / static int main_dobry() { int64_t zabaw; std::cin >> zabaw; LicznoscCyfr wynik{0}; for (int i = 1; i <= zabaw ; ++i) { int cyfraWyniku = mnoz_l(i); ++wynik[cyfraWyniku]; } wypisz(wynik); return 0; } / * */ static int main_szybki() { int64_t zabaw; std::cin >> zabaw; LicznoscCyfr wynik{0}; // std::cerr << "\n> " << zabaw << "\n"; ++zabaw; std::string zapis_napis = std::to_string(zabaw); std::vector<int> zapis; for (auto &c: zapis_napis) { zapis.push_back(c - '0'); } --zabaw; for (int i = 1; i < 10 && i <= zabaw; ++i) { ++wynik[i]; } // auto t1 = std::chrono::steady_clock::now(); // auto t2 = std::chrono::steady_clock::now(); if (2 <= zapis.size()) { wynik = pelneBloki[zapis.size()]; } // wypisz(wynik, std::cout); std::cout << "\n"; for (size_t j = 0; j < zapis.size() && 1 < zapis.size(); ++j) { int k = zapis.size() - j - 1; LicznoscCyfr skladnik{0}; zPoczatkiem(k, zapis_napis.substr(0, j+1), skladnik); dodaj(wynik, skladnik); // wypisz(wynik, std::cout); std::cout << "\n"; // t2 = std::chrono::steady_clock::now(); std::cerr << "E" << j << " " << std::chrono::duration<double>(t2-t1) << "\n"; t1=t2; } wypisz(wynik, std::cout); std::cout << "\n"; return 0; } /* int main() { for (int k = 4; k < 17; ++k) { for (int z = 2; z <= 999; ++z) { std::string zz = std::to_string(z); while (zz.size() < 3) { zz = "0" + zz; } LicznoscCyfr skladnik{0}; zPoczatkiem(k, zz, skladnik); std::cerr << "{{" << k << ",\"" << zz << "\"},{"; wypisz(skladnik); std::cerr << "}},\n"; } } } */ int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); int dni; std::cin >> dni; while (dni--) { // main_dobry(); main_szybki(); } 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 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 | #include <iostream> #include <vector> #include <numeric> #include <cstdlib> #include <functional> #include <string> #include <array> #include <chrono> #include <map> constexpr static int64_t CYFR = 10; typedef std::array<int64_t,CYFR> LicznoscCyfr; template<class T> static void wypisz(const T &v, std::ostream &str=std::cerr) { for (auto it = std::begin(v); it != std::end(v); ++it) { str << *it << " "; } } constexpr static int64_t silnia(int64_t n) { int64_t wynik = 1; for (int64_t i = 2; i <= n; ++i) { wynik *= i; } return wynik; } constexpr static int64_t silnia_tab[] = { silnia(0), silnia(1), silnia(2), silnia(3), silnia(4), silnia(5), silnia(6), silnia(7), silnia(8), silnia(9), silnia(10), silnia(11), silnia(12), silnia(13), silnia(14), silnia(15), silnia(16), silnia(17), silnia(18), silnia(19), }; constexpr static LicznoscCyfr pelneBloki[] = { {0}, {0}, {0,1,1,1,1,1,1,1,1,1}, {24, 2, 9, 3, 10, 7, 14, 3, 23, 4, }, {476, 3, 77, 6, 65, 40, 155, 6, 161, 10, }, {6739, 4, 543, 10, 279, 172, 1172, 10, 1050, 20, }, {82401, 5, 3213, 15, 894, 607, 6843, 15, 5971, 35, }, {902608, 6, 16673, 21, 2345, 2073, 43538, 21, 32658, 56, }, {9394517, 7, 86093, 28, 6174, 7414, 318457, 28, 187197, 84, }, {96122290, 8, 503815, 36, 66354, 26070, 2223803, 36, 1057467, 120, }, {975700392, 9, 3529057, 45, 1005399, 84099, 14185700, 45, 5495088, 165, }, {9854082822, 10, 25402097, 55, 9737884, 243529, 84670477, 55, 25862850, 220, }, {99180099587, 11, 162303510, 66, 66699415, 636130, 477808607, 66, 112452321, 286, }, {995679223590, 12, 884504882, 78, 356586629, 1518166, 2577052118, 78, 501114082, 364, }, {9977627937023, 13, 4156234265, 91, 1585685916, 3354325, 13759255632, 91, 2867532188, 455, }, {99879659224379, 14, 17270407962, 105, 6342292785, 6940831, 75251167843, 105, 21469965415, 560, }, {999321444658475, 15, 65375131342, 120, 30560724590, 13579716, 418157757456, 120, 164448147485, 680, }, {9996118748668338, 16, 232901619970, 136, 264486626166, 25318372, 2267313716636, 136, 1116524049413, 816, }, {99978099721506172, 17, 807191392546, 153, 2926013859615, 45270813, 11616142299625, 153, 6550885669936, 969, }, {999879067589400315, 18, 2795912956450, 171, 28611339267816, 78039555, 55909713312571, 171, 33615367021792, 1140, }, }; /* static void kombinacjeZPowtorzeniami( int64_t n, int64_t k, std::function<void(LicznoscCyfr&)> cb ) { // std::cerr << "KzP " << n << " " << k << std::endl; LicznoscCyfr licznosc{0}; std::vector<int> indeksy(k); licznosc[0] = k; for (;;) { cb(licznosc); int i = k-1; for (i = k-1; 0 <= i; --i) { if (indeksy[i] != n-1) { break; } } if (i == -1) { return; } int w = indeksy[i] + 1; for (int j = i; j < k; ++j) { --licznosc[indeksy[j]]; indeksy[j] = w; ++licznosc[indeksy[j]]; } } } */ static int64_t mnoz_rek(int64_t liczba) { if (liczba <= 9) { return liczba; } int64_t iloczyn = 1; while (liczba) { auto iloraz = std::lldiv(liczba, 10); iloczyn *= iloraz.rem; liczba = iloraz.quot; } return mnoz_rek(iloczyn); } static int64_t mnoz_iter(int64_t liczba) { while (9 < liczba) { int64_t iloczyn = 1; while (liczba) { auto iloraz = std::lldiv(liczba, 10); if (iloraz.rem == 0) { return 0; } iloczyn *= iloraz.rem; liczba = iloraz.quot; } liczba = iloczyn; } return liczba; } static auto mnoz_l = mnoz_iter; static int64_t mnoz(const LicznoscCyfr &licznoscCyfr) { int64_t iloczynCyfr = 1; for (size_t i = 0; i < CYFR; ++i) { for (int j = 0; j < licznoscCyfr[i]; ++j) { iloczynCyfr *= i; } } return mnoz_l(iloczynCyfr); } static int64_t zliczPowtorzenia(const LicznoscCyfr &licznoscCyfr) { int64_t licznik = 0; int64_t mianownik = 1; for (size_t i = 0; i < CYFR; ++i) { if (licznoscCyfr[i]) { licznik += licznoscCyfr[i]; mianownik *= silnia_tab[licznoscCyfr[i]]; } } licznik = silnia_tab[licznik]; return licznik / mianownik; } void dodaj(LicznoscCyfr & a, const LicznoscCyfr &b) { for (int i = 0; i < CYFR; ++i) { a[i] += b[i]; } } void zPoczatkiem(const int k, std::string zapis, LicznoscCyfr &wynik) { static std::map<std::pair<int,std::string>,LicznoscCyfr> czescioweBloki{ {{4, "2"}, {7263, 1, 466, 4, 214, 132, 1017, 4, 889, 10, }}, {{4, "3"}, {15176, 1, 819, 4, 312, 132, 1937, 4, 1605, 10, }}, {{4, "4"}, {23107, 1, 1293, 5, 422, 206, 2550, 4, 2398, 14, }}, {{4, "5"}, {31538, 1, 1549, 5, 459, 206, 3266, 4, 2958, 14, }}, {{4, "6"}, {41413, 1, 1549, 5, 459, 331, 3266, 4, 2958, 14, }}, {{4, "7"}, {49893, 1, 1873, 5, 501, 331, 3817, 4, 3561, 14, }}, {{4, "8"}, {58383, 1, 2031, 5, 569, 395, 4668, 5, 3929, 14, }}, {{4, "9"}, {67236, 1, 2235, 5, 579, 395, 5217, 5, 4313, 14, }}, {{5, "2"}, {85662, 1, 2670, 5, 615, 435, 5671, 5, 4921, 15, }}, {{5, "3"}, {174858, 1, 4567, 5, 845, 435, 10546, 5, 8723, 15, }}, {{5, "4"}, {263919, 1, 6868, 6, 1090, 680, 14777, 5, 12634, 20, }}, {{5, "5"}, {355364, 1, 8224, 6, 1161, 680, 18915, 5, 15624, 20, }}, {{5, "6"}, {454983, 1, 8224, 6, 1161, 1061, 18915, 5, 15624, 20, }}, {{5, "7"}, {545991, 1, 9729, 6, 1241, 1061, 23291, 5, 18655, 20, }}, {{5, "8"}, {637293, 1, 10344, 6, 1376, 1306, 28132, 6, 21516, 20, }}, {{5, "9"}, {730010, 1, 11399, 6, 1391, 1306, 31829, 6, 24032, 20, }}, {{6, "2"}, {920207, 1, 13460, 6, 1451, 1466, 36695, 6, 26687, 21, }}, {{6, "3"}, {1853981, 1, 22988, 6, 1913, 1466, 70934, 6, 48684, 21, }}, {{6, "4"}, {2783688, 1, 34409, 7, 2384, 2417, 108095, 6, 68966, 27, }}, {{6, "5"}, {3726391, 1, 41435, 7, 2565, 2417, 139054, 6, 88097, 27, }}, {{6, "6"}, {4725198, 1, 41435, 7, 2565, 3610, 139054, 6, 88097, 27, }}, {{6, "7"}, {5663690, 1, 49501, 7, 2820, 3610, 175199, 6, 105139, 27, }}, {{6, "8"}, {6608401, 1, 52224, 7, 3176, 4681, 206856, 7, 124620, 27, }}, {{6, "9"}, {7557700, 1, 57906, 7, 3557, 4681, 234332, 7, 141782, 27, }}, {{7, "2"}, {9491909, 1, 69420, 7, 3829, 5341, 274919, 7, 154539, 28, }}, {{7, "3"}, {19053743, 1, 121844, 7, 7917, 5341, 523993, 7, 287119, 28, }}, {{7, "4"}, {28591924, 1, 187693, 8, 12516, 8911, 802565, 7, 396340, 35, }}, {{7, "5"}, {38209981, 1, 231353, 8, 20896, 8911, 1018424, 7, 510384, 35, }}, {{7, "6"}, {48206452, 1, 231353, 8, 20896, 12440, 1018424, 7, 510384, 35, }}, {{7, "7"}, {57807359, 1, 284743, 8, 29926, 12440, 1262340, 7, 603141, 35, }}, {{7, "8"}, {67467577, 1, 305281, 8, 37129, 16437, 1462330, 8, 711194, 35, }}, {{7, "9"}, {77133711, 1, 346357, 8, 52697, 16437, 1645618, 8, 805128, 35, }}, {{8, "2"}, {96727773, 1, 417722, 8, 60180, 18656, 1905346, 8, 870270, 36, }}, {{8, "3"}, {193911227, 1, 783246, 8, 162256, 18656, 3534228, 8, 1590334, 36, }}, {{8, "4"}, {291037324, 1, 1226714, 9, 254356, 30172, 5299272, 8, 2152100, 44, }}, {{8, "5"}, {388607927, 1, 1577026, 9, 408077, 30172, 6653804, 8, 2722932, 44, }}, {{8, "6"}, {488598502, 1, 1577026, 9, 408077, 39597, 6653804, 8, 2722932, 44, }}, {{8, "7"}, {586147156, 1, 1977681, 9, 544521, 39597, 8114223, 8, 3176760, 44, }}, {{8, "8"}, {684025742, 1, 2231308, 9, 648353, 51869, 9356027, 9, 3686638, 44, }}, {{8, "9"}, {781955697, 1, 2577788, 9, 845789, 51869, 10464393, 9, 4104401, 44, }}, {{9, "2"}, {979578102, 1, 3025242, 9, 939045, 58029, 11961897, 9, 4437621, 45, }}, {{9, "3"}, {1962241866, 1, 5886406, 9, 2176527, 58029, 21788253, 9, 7848855, 45, }}, {{9, "4"}, {2945160737, 1, 8936809, 10, 3151272, 89898, 32135965, 9, 10525245, 54, }}, {{9, "5"}, {3930679130, 1, 11653576, 10, 4583029, 89898, 40014583, 9, 12979710, 54, }}, {{9, "6"}, {4930656479, 1, 11653576, 10, 4583029, 112549, 40014583, 9, 12979710, 54, }}, {{9, "7"}, {5916513650, 1, 14390677, 10, 5718469, 112549, 48290552, 9, 14974029, 54, }}, {{9, "8"}, {6903379516, 1, 16859191, 10, 6590950, 144670, 55885214, 10, 17140384, 54, }}, {{9, "9"}, {7891676275, 1, 19325158, 10, 8042767, 144670, 62053925, 10, 18757130, 54, }}, {{10, "2"}, {9878382430, 1, 21873040, 10, 8732485, 159430, 70484777, 10, 20367762, 55, }}, {{10, "3"}, {19778908524, 1, 41748973, 10, 18107625, 159430, 126257547, 10, 34817825, 55, }}, {{10, "4"}, {29683777889, 1, 60298845, 11, 24854110, 237095, 184257126, 10, 46574848, 65, }}, {{10, "5"}, {39604993054, 1, 77524692, 11, 33838451, 237095, 227215608, 10, 56191013, 65, }}, {{10, "6"}, {49604943473, 1, 77524692, 11, 33838451, 286676, 227215608, 10, 56191013, 65, }}, {{10, "7"}, {59530214096, 1, 92994712, 11, 40431356, 286676, 271795453, 10, 64277620, 65, }}, {{10, "8"}, {69455424423, 1, 110499636, 11, 45608556, 360981, 314860371, 11, 73245945, 65, }}, {{10, "9"}, {79395087992, 1, 124404886, 11, 53276971, 360981, 347479736, 11, 79389346, 65, }}, {{11, "2"}, {99326016765, 1, 136901413, 11, 56961531, 392601, 393138130, 11, 86589471, 66, }}, {{11, "3"}, {198800421551, 1, 250931132, 11, 109245488, 392601, 693167684, 11, 145841455, 66, }}, {{11, "4"}, {298309356910, 1, 346368661, 12, 144443519, 563552, 1003029137, 11, 196238120, 77, }}, {{11, "5"}, {397908972055, 1, 435333141, 12, 187760035, 563552, 1229573357, 11, 237797759, 77, }}, {{11, "6"}, {497908871767, 1, 435333141, 12, 187760035, 663840, 1229573357, 11, 237797759, 77, }}, {{11, "7"}, {597538303282, 1, 507992013, 12, 217743285, 663840, 1461421623, 11, 273875856, 77, }}, {{11, "8"}, {697143371743, 1, 605076573, 12, 241898966, 819941, 1687273777, 12, 321558898, 77, }}, {{11, "9"}, {796838598701, 1, 669496962, 12, 274166597, 819941, 1861846087, 12, 355071610, 77, }}, {{12, "2"}, {996499124003, 1, 722201372, 12, 289887214, 882036, 2099243511, 12, 388661761, 78, }}, {{12, "3"}, {1993825074064, 1, 1270328437, 12, 524472292, 882036, 3684864563, 12, 694378505, 78, }}, {{12, "4"}, {2991369413583, 1, 1690136498, 13, 674385826, 1228746, 5306801133, 12, 958034098, 90, }}, {{12, "5"}, {3989304058897, 1, 2079025043, 13, 847110731, 1228746, 6529219257, 12, 1239357210, 90, }}, {{12, "6"}, {4989303869012, 1, 2079025043, 13, 847110731, 1418631, 6529219257, 12, 1239357210, 90, }}, {{12, "7"}, {5987432489274, 1, 2371632117, 13, 961448141, 1418631, 7755753173, 12, 1477258548, 90, }}, {{12, "8"}, {6985310749710, 1, 2818246210, 13, 1055992053, 1722375, 8947442795, 13, 1865846740, 90, }}, {{12, "9"}, {7983649058495, 1, 3077043738, 13, 1171879155, 1722375, 9932833512, 13, 2167462608, 90, }}, {{13, "2"}, {9981948713433, 1, 3271729383, 13, 1229099287, 1836159, 11182203514, 13, 2366418106, 91, }}, {{13, "3"}, {19967785226302, 1, 5557262621, 13, 2132499837, 1836159, 19820117344, 13, 4703057619, 91, }}, {{13, "4"}, {29954996620796, 1, 7177233909, 14, 2691849758, 2493920, 28543244107, 13, 6588557378, 104, }}, {{13, "5"}, {39943452920822, 1, 8685632138, 14, 3321278013, 2493920, 35435256208, 13, 9102418767, 104, }}, {{13, "6"}, {49943452580689, 1, 8685632138, 14, 3321278013, 2834053, 35435256208, 13, 9102418767, 104, }}, {{13, "7"}, {59933269579535, 1, 9733162206, 14, 3738999993, 2834053, 42196577152, 13, 11058846929, 104, }}, {{13, "8"}, {69921020801811, 1, 11507092858, 14, 4078754681, 3389426, 48946621336, 14, 14443339755, 104, }}, {{13, "9"}, {79911143412574, 1, 12469336348, 14, 4538058045, 3389426, 54627204712, 14, 17218598762, 104, }}, {{14, "2"}, {99902031287356, 1, 13114173697, 14, 4756606869, 3586506, 61491912211, 14, 18602433227, 105, }}, {{14, "3"}, {199821672997388, 1, 21720278037, 14, 8425513957, 3586506, 110020019269, 14, 38157604709, 105, }}, {{14, "4"}, {299750937350083, 1, 27367852648, 15, 10850212520, 4767245, 158286324475, 14, 52553492880, 119, }}, {{14, "5"}, {399682637001803, 1, 32851722664, 15, 14221319715, 4767245, 197184570176, 14, 73100618248, 119, }}, {{14, "6"}, {499682636420466, 1, 32851722664, 15, 14221319715, 5348582, 197184570176, 14, 73100618248, 119, }}, {{14, "7"}, {599624653739182, 1, 36319500525, 15, 16791100474, 5348582, 234409954478, 14, 87820356610, 119, }}, {{14, "8"}, {699552527687930, 1, 42574404740, 15, 18405658706, 6313105, 273717775863, 15, 112768159506, 119, }}, {{14, "9"}, {799492337241424, 1, 46140961384, 15, 22535330357, 6313105, 305153586675, 15, 133826566905, 119, }}, {{15, "2"}, {999441785434096, 1, 48104723380, 15, 24218431805, 6638885, 342906589613, 15, 142978182070, 120, }}, {{15, "3"}, {1998972180424461, 1, 78720252234, 15, 51938779910, 6638885, 610837899253, 15, 286316005106, 120, }}, {{15, "4"}, {2998573822753512, 1, 97086573627, 16, 72954155495, 8662145, 872342511637, 15, 383785343417, 135, }}, {{15, "5"}, {3998167733253276, 1, 116898215695, 16, 111227825571, 8662145, 1080796999359, 15, 523335043787, 135, }}, {{15, "6"}, {4998167732298725, 1, 116898215695, 16, 111227825571, 9616696, 1080796999359, 15, 523335043787, 135, }}, {{15, "7"}, {5997839285717131, 1, 127985860185, 16, 141885895356, 9616696, 1274339767990, 15, 616493142475, 135, }}, {{15, "8"}, {6997435663246838, 1, 147960323755, 16, 156506259161, 11220901, 1491602104290, 16, 768256844887, 135, }}, {{15, "9"}, {7997072526725793, 1, 161877113715, 16, 212690197091, 11220901, 1653588538484, 16, 899306203848, 135, }}, {{16, "2"}, {9996797304009863, 1, 167526488628, 16, 233925901576, 11738656, 1849155959180, 16, 952075901928, 136, }}, {{16, "3"}, {19994077975350304, 1, 275249685899, 16, 565409606928, 11738656, 3243028341380, 16, 1838325276664, 136, }}, {{16, "4"}, {29991879647632435, 1, 332918429911, 17, 815888870664, 15071032, 4568980291472, 16, 2402549704300, 152, }}, {{16, "5"}, {39989498699614956, 1, 407034590035, 17, 1284059901865, 15071032, 5611269301448, 16, 3198921520478, 152, }}, {{16, "6"}, {49989498698100843, 1, 407034590035, 17, 1284059901865, 16585145, 5611269301448, 16, 3198921520478, 152, }}, {{16, "7"}, {59987678582177207, 1, 442713967986, 17, 1640042949745, 16585145, 6539199727929, 16, 3699444591802, 152, }}, {{16, "8"}, {69985587909072076, 1, 501357542916, 17, 1796603368801, 19156761, 7633362104901, 17, 4480748754358, 152, }}, {{16, "9"}, {79983420392463347, 1, 558486251012, 17, 2427387843257, 19156761, 8423196145209, 17, 5170518140227, 152, }}, {{17, "2"}, {99981980972837834, 1, 574289772576, 17, 2661527233449, 19952441, 9348828582989, 17, 5434361620523, 153, }}, {{17, "3"}, {199966522889980769, 1, 961448206995, 17, 6251487635107, 19952441, 16130571530841, 17, 10133582693659, 153, }}, {{17, "4"}, {299954741596171382, 1, 1142000239324, 18, 8820909980356, 25256866, 22333130196133, 17, 12962338155733, 170, }}, {{17, "5"}, {399940967528339556, 1, 1429637250877, 18, 13411493270621, 25256866, 27303684755420, 17, 16887631126454, 170, }}, {{17, "6"}, {499940967526009025, 1, 1429637250877, 18, 13411493270621, 27587397, 27303684755420, 17, 16887631126454, 170, }}, {{17, "7"}, {599931071578518281, 1, 1547961968139, 18, 16701164640141, 27587397, 31449598403068, 17, 19229668882768, 170, }}, {{17, "8"}, {699920974043476780, 1, 1708107787154, 18, 18128127154706, 31580918, 36458765045032, 18, 22730924955203, 170, }}, {{17, "9"}, {799908216902297931, 1, 1944546499844, 18, 23646158965631, 31580918, 40292317674601, 18, 25900042980868, 170, }}, {{18, "2"}, {999900967867894143, 1, 1988721563904, 18, 25685325408201, 32768742, 44293571012946, 18, 27064481351856, 171, }}, {{18, "3"}, {1999814646636797919, 1, 3416180322598, 18, 57057287334801, 32768742, 75904783654536, 18, 48975079121196, 171, }}, {{18, "4"}, {2999753114925096075, 1, 3991414496500, 19, 78339474448818, 40965123, 103007160518823, 18, 61546984474434, 189, }}, {{18, "5"}, {3999674931531568218, 1, 5115811502536, 19, 114475755036751, 40965123, 126710183981970, 18, 78766676945175, 189, }}, {{18, "6"}, {4999674931528074477, 1, 5115811502536, 19, 114475755036751, 44458864, 126710183981970, 18, 78766676945175, 189, }}, {{18, "7"}, {5999622204480934815, 1, 5518760744380, 19, 139077040529212, 44458864, 144593598169639, 18, 88606075162863, 189, }}, {{18, "8"}, {6999575748823320178, 1, 5929335085525, 19, 149785017657988, 50491213, 165949786322977, 19, 102586987121891, 189, }}, {{18, "9"}, {7999502835874529134, 1, 6875184168781, 19, 188974161292423, 50491213, 185510518365538, 19, 115804211152683, 189, }}, }; // std::cerr << "P " << k << " " << zapis << "\n"; if (auto znany = czescioweBloki.find({k, zapis}); znany != czescioweBloki.end()) { dodaj(wynik, znany->second); // std::cerr << "."; return; } // std::cerr << k << " - " << zapis << "\n"; const size_t j = zapis.size()-1; LicznoscCyfr licznoscCyfr{0}; licznoscCyfr[0] = k; std::vector<int> indeksy(k); LicznoscCyfr licznosc{0}; licznosc[0] = k; for (size_t m = 0; m < j; ++m) { ++licznosc[zapis[m]-'0']; } for (;;) { { int64_t powtorzen = zliczPowtorzenia(licznoscCyfr); for (int p = (j==0 ? 1 : 0); p < (zapis[j]-'0'); ++p) { ++licznosc[p]; int cyfraWyniku = (licznosc[0] || (licznosc[5] && (licznosc[2] || licznosc[4] || licznosc[6] || licznosc[8]))) ? 0 : mnoz(licznosc); wynik[cyfraWyniku] += powtorzen; --licznosc[p]; } } int i = k-1; for (i = k-1; 0 <= i; --i) { if (indeksy[i] != CYFR-1) { break; } } if (i == -1) { break; } int w = indeksy[i] + 1; for (int j = i; j < k; ++j) { --licznosc[indeksy[j]]; --licznoscCyfr[indeksy[j]]; indeksy[j] = w; ++licznosc[indeksy[j]]; ++licznoscCyfr[indeksy[j]]; } } if (zapis.size() <= 4) { czescioweBloki.insert({{k, zapis}, {wynik}}); } } /* * / static int main_dobry() { int64_t zabaw; std::cin >> zabaw; LicznoscCyfr wynik{0}; for (int i = 1; i <= zabaw ; ++i) { int cyfraWyniku = mnoz_l(i); ++wynik[cyfraWyniku]; } wypisz(wynik); return 0; } / * */ static int main_szybki() { int64_t zabaw; std::cin >> zabaw; LicznoscCyfr wynik{0}; // std::cerr << "\n> " << zabaw << "\n"; ++zabaw; std::string zapis_napis = std::to_string(zabaw); std::vector<int> zapis; for (auto &c: zapis_napis) { zapis.push_back(c - '0'); } --zabaw; for (int i = 1; i < 10 && i <= zabaw; ++i) { ++wynik[i]; } // auto t1 = std::chrono::steady_clock::now(); // auto t2 = std::chrono::steady_clock::now(); if (2 <= zapis.size()) { wynik = pelneBloki[zapis.size()]; } // wypisz(wynik, std::cout); std::cout << "\n"; for (size_t j = 0; j < zapis.size() && 1 < zapis.size(); ++j) { int k = zapis.size() - j - 1; LicznoscCyfr skladnik{0}; zPoczatkiem(k, zapis_napis.substr(0, j+1), skladnik); dodaj(wynik, skladnik); // wypisz(wynik, std::cout); std::cout << "\n"; // t2 = std::chrono::steady_clock::now(); std::cerr << "E" << j << " " << std::chrono::duration<double>(t2-t1) << "\n"; t1=t2; } wypisz(wynik, std::cout); std::cout << "\n"; return 0; } /* int main() { for (int k = 4; k < 17; ++k) { for (int z = 2; z <= 999; ++z) { std::string zz = std::to_string(z); while (zz.size() < 3) { zz = "0" + zz; } LicznoscCyfr skladnik{0}; zPoczatkiem(k, zz, skladnik); std::cerr << "{{" << k << ",\"" << zz << "\"},{"; wypisz(skladnik); std::cerr << "}},\n"; } } } */ int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); int dni; std::cin >> dni; while (dni--) { // main_dobry(); main_szybki(); } return 0; } |