/* 首先求出multiset,设其大小是size,那么除数集合是[2,size+1] 对于multiset里面的某个余数x,其可能的除数集合就是[x+1,size+1] 将余数从大到小统计贡献 本题有一个坑:最后个余数的位置里不能填0,因为余数是0表示被除尽,那么商必不可能是0,所以其不可能是最后一个余数 所有最后一位填0的情况要减去 答案要-1 */ #include<bits/stdc++.h> using namespace std; #define ll long long ll k,C[21][21]; vector<ll>a; void init(){ C[0][0]=1; for(int i=1;i<=20;i++){ C[i][0]=1; for(int j=1;j<=i;j++) C[i][j]=C[i-1][j]+C[i-1][j-1]; } } ll solve(){ ll res=1; int len=0,tot=0; for(int i=a.size()-1;i>=0;i--){ if(i==0){ len++; if(a[i]<2) res*=C[a.size()-tot][len]; else res=0; } else { ++len; if(a[i]==a[i-1])continue; res*=C[(a.size()+1-a[i])-tot][len]; tot+=len; len=0; } } return res; } int main(){ int t;cin>>t; init(); while(t--){ a.clear(); cin>>k; int x=2; while(k){ a.push_back(k%x); k/=x;x++; } sort(a.begin(),a.end()); ll ans=solve(); //减去0是最后一个余数的情况 if(a[0]==0){ a.erase(a.begin());ans-=solve(); } cout<<ans-1<<' '; } }