#include <bits/stdc++.h> using namespace std; #define st first #define nd second #define pb push_back #define all(x) (x).begin(), (x).end() #define BOOST ios_base::sync_with_stdio(0), cin.tie(0) typedef long long ll; typedef long double ld; typedef pair<int, int> ii; struct node{ ll x; int y; int c; ll denom; int dic[10]; }; vector<node> t; ll ans[10]; ll fac[20]; ll prodig(ll x){ if(x == 0) return 0; ll res = 1; while(x){ res *= x%10; x /= 10; } return res; } void go(ll x){ ll y = x; while(y >= 10) y = prodig(y); if(y == 0) return; node res = {}; res.x = x, res.y = y, res.denom = 1; while(x){ res.dic[x%10]++; x /= 10; res.c++; } for(int i=1; i<10; i++){ res.denom *= fac[res.dic[i]]; } t.pb(res); } void rec(ll x, int c, int dig){ if(dig == 10){ go(x); return; } for(int i=0; i<=18-c; i++){ rec(x, c + i, dig+1); x = x * 10 + dig; } } void f(ll n){ for(int i=0; i<10; i++) ans[i] = 0; vector<int> v; while(n){ v.pb(n % 10); n /= 10; } reverse(all(v)); int s = v.size(); for(auto it : t){ if(s > it.c){ ans[it.y] += fac[it.c]/it.denom; continue; } if(s < it.c){ continue; } int c = it.c; ll denom = it.denom; int dic[10]; for(int i=0; i<10; i++) dic[i] = it.dic[i]; for(int j=0; j<s; j++){ c--; for(int k=1; k<v[j]; k++){ if(!dic[k]) continue; denom /= dic[k]; dic[k]--; ans[it.y] += fac[c]/denom; dic[k]++; denom *= dic[k]; } if(!dic[v[j]]) break; denom /= dic[v[j]]; dic[v[j]]--; } } } int main(){ BOOST; fac[0] = 1; for(int i=1; i<20; i++) fac[i] = fac[i-1] * i; rec(0, 0, 1); int q; cin >> q; while(q--){ ll n; cin >> n; f(n+1); for(int i=1; i<10; i++){ n -= ans[i]; } ans[0] = n; for(int i=0; i<10; i++){ cout << ans[i] << " "; } 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 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 | #include <bits/stdc++.h> using namespace std; #define st first #define nd second #define pb push_back #define all(x) (x).begin(), (x).end() #define BOOST ios_base::sync_with_stdio(0), cin.tie(0) typedef long long ll; typedef long double ld; typedef pair<int, int> ii; struct node{ ll x; int y; int c; ll denom; int dic[10]; }; vector<node> t; ll ans[10]; ll fac[20]; ll prodig(ll x){ if(x == 0) return 0; ll res = 1; while(x){ res *= x%10; x /= 10; } return res; } void go(ll x){ ll y = x; while(y >= 10) y = prodig(y); if(y == 0) return; node res = {}; res.x = x, res.y = y, res.denom = 1; while(x){ res.dic[x%10]++; x /= 10; res.c++; } for(int i=1; i<10; i++){ res.denom *= fac[res.dic[i]]; } t.pb(res); } void rec(ll x, int c, int dig){ if(dig == 10){ go(x); return; } for(int i=0; i<=18-c; i++){ rec(x, c + i, dig+1); x = x * 10 + dig; } } void f(ll n){ for(int i=0; i<10; i++) ans[i] = 0; vector<int> v; while(n){ v.pb(n % 10); n /= 10; } reverse(all(v)); int s = v.size(); for(auto it : t){ if(s > it.c){ ans[it.y] += fac[it.c]/it.denom; continue; } if(s < it.c){ continue; } int c = it.c; ll denom = it.denom; int dic[10]; for(int i=0; i<10; i++) dic[i] = it.dic[i]; for(int j=0; j<s; j++){ c--; for(int k=1; k<v[j]; k++){ if(!dic[k]) continue; denom /= dic[k]; dic[k]--; ans[it.y] += fac[c]/denom; dic[k]++; denom *= dic[k]; } if(!dic[v[j]]) break; denom /= dic[v[j]]; dic[v[j]]--; } } } int main(){ BOOST; fac[0] = 1; for(int i=1; i<20; i++) fac[i] = fac[i-1] * i; rec(0, 0, 1); int q; cin >> q; while(q--){ ll n; cin >> n; f(n+1); for(int i=1; i<10; i++){ n -= ans[i]; } ans[0] = n; for(int i=0; i<10; i++){ cout << ans[i] << " "; } cout << "\n"; } } |