#include<bits/stdc++.h>
using namespace std;
using ll=long long;
vector<ll> pool;
vector<int> ans;
vector<vector<int>> trans;
map<ll,int> ind;
void dfs(int cur,ll prod,int mx)
{
pool.push_back(prod);
if(cur==18) return ;
for(int i=mx;i<=9;i++)
dfs(cur+1,prod*i,i);
}
ll dp[20][37000][10];
ll f[20][10];
void solve()
{
ll n;
cin>>n;
vector<int> vec;
while(n)
{
vec.push_back(n%10);
n/=10;
}
reverse(vec.begin(),vec.end());
static ll ans[10];
memcpy(ans,f[vec.size()-1],sizeof(ans));
int curstate=1;
for(int i=0;i<vec.size();i++)
{
for(int j=(i==0?1:0);j<vec[i];j++)
for(int v=0;v<10;v++)
ans[v]+=dp[vec.size()-i-1][trans[curstate][j]][v];
curstate=trans[curstate][vec[i]];
}
for(int v=0;v<10;v++)
ans[v]+=dp[0][curstate][v];
for(int i=0;i<10;i++)
cout<<ans[i]<<" ";
cout<<'\n';
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
dfs(0,1,0);
sort(pool.begin(),pool.end());
pool.resize(unique(pool.begin(),pool.end())-pool.begin());
trans=vector<vector<int>>(pool.size(),vector<int>(10,-1));
for(int i=0;i<pool.size();i++)
ind[pool[i]]=i;
for(int i=0;i<pool.size();i++)
for(int j=0;j<10;j++)
{
ll nval=pool[i]*j;
if(ind.find(nval)!=ind.end())
trans[i][j]=ind[nval];
}
ans.resize(pool.size());
for(int i=0;i<pool.size();i++)
if(pool[i]<10)
ans[i]=pool[i];
else
{
ll prod=1;
ll x=pool[i];
while(x)
{
prod*=(x%10);
x/=10;
}
ans[i]=ans[ind[prod]];
}
for(int i=0;i<pool.size();i++)
dp[0][i][ans[i]]=1;
for(int i=1;i<=18;i++)
for(int j=0;j<pool.size();j++)
for(int x=0;x<10;x++)
for(int v=0;v<10;v++)
if(~trans[j][x])
dp[i][j][v]+=dp[i-1][trans[j][x]][v];
for(int i=1;i<=18;i++)
{
for(int j=0;j<10;j++)
f[i][j]=f[i-1][j];
for(int x=1;x<=9;x++)
for(int j=0;j<10;j++)
f[i][j]+=dp[i-1][x][j];
}
int t;
cin>>t;
while(t--)
solve();
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 | #include<bits/stdc++.h> using namespace std; using ll=long long; vector<ll> pool; vector<int> ans; vector<vector<int>> trans; map<ll,int> ind; void dfs(int cur,ll prod,int mx) { pool.push_back(prod); if(cur==18) return ; for(int i=mx;i<=9;i++) dfs(cur+1,prod*i,i); } ll dp[20][37000][10]; ll f[20][10]; void solve() { ll n; cin>>n; vector<int> vec; while(n) { vec.push_back(n%10); n/=10; } reverse(vec.begin(),vec.end()); static ll ans[10]; memcpy(ans,f[vec.size()-1],sizeof(ans)); int curstate=1; for(int i=0;i<vec.size();i++) { for(int j=(i==0?1:0);j<vec[i];j++) for(int v=0;v<10;v++) ans[v]+=dp[vec.size()-i-1][trans[curstate][j]][v]; curstate=trans[curstate][vec[i]]; } for(int v=0;v<10;v++) ans[v]+=dp[0][curstate][v]; for(int i=0;i<10;i++) cout<<ans[i]<<" "; cout<<'\n'; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); dfs(0,1,0); sort(pool.begin(),pool.end()); pool.resize(unique(pool.begin(),pool.end())-pool.begin()); trans=vector<vector<int>>(pool.size(),vector<int>(10,-1)); for(int i=0;i<pool.size();i++) ind[pool[i]]=i; for(int i=0;i<pool.size();i++) for(int j=0;j<10;j++) { ll nval=pool[i]*j; if(ind.find(nval)!=ind.end()) trans[i][j]=ind[nval]; } ans.resize(pool.size()); for(int i=0;i<pool.size();i++) if(pool[i]<10) ans[i]=pool[i]; else { ll prod=1; ll x=pool[i]; while(x) { prod*=(x%10); x/=10; } ans[i]=ans[ind[prod]]; } for(int i=0;i<pool.size();i++) dp[0][i][ans[i]]=1; for(int i=1;i<=18;i++) for(int j=0;j<pool.size();j++) for(int x=0;x<10;x++) for(int v=0;v<10;v++) if(~trans[j][x]) dp[i][j][v]+=dp[i-1][trans[j][x]][v]; for(int i=1;i<=18;i++) { for(int j=0;j<10;j++) f[i][j]=f[i-1][j]; for(int x=1;x<=9;x++) for(int j=0;j<10;j++) f[i][j]+=dp[i-1][x][j]; } int t; cin>>t; while(t--) solve(); return 0; } |
English