#include using namespace std; int prime[40001]; vector primes; void sieve() { fill(begin(prime), end(prime), 1); prime[0]=prime[1]=0; for(int i=2;i<=40000;++i) { if(prime[i]) { primes.push_back(i); for(int j=i*i;j<=40000;j+=i) { prime[j]=0; } } } } vector> factorize(int x) { vector> ans; for(auto i:primes) { if(x==1) break ; int curr=0; while(x%i==0) { x/=i; curr++; } if(curr>0) ans.push_back({i, curr}); } if(x>1) ans.push_back({x, 1}); return ans; } void gendivisors(int ind, vector>& factored, vector& res, int akt=1) { if(ind==(int)factored.size()) { res.push_back(akt); return ; } int curr=1; gendivisors(ind+1, factored, res, akt); for(int j=1;j<=factored[ind].second;++j) { gendivisors(ind+1, factored, res, akt*(curr*=factored[ind].first)); } } unordered_map> memo; vector calc_divisors(int x) { if(memo.find(x)!=memo.end()) return memo[x]; vector> factored=factorize(x); gendivisors(0, factored, memo[x]); return memo[x]; } unordered_map dp[1001], par[1001]; const int inf=2000000000; int calc(int n, int c) { if(n==1) return c; if(n==0 && c==1) return 0; if(n==0) return inf; if(dp[n].find(c)!=dp[n].end()) return dp[n][c]; int ans=(int)1e9+5; for(auto i:calc_divisors(c)) { if(calc(n-1, c/i)<=i+1 && ans>i) { ans=i; par[n][c]=i; } } return dp[n][c]=ans; } vector build(int n, int c) { calc(n,c); vector ans; while(par[n][c]>0) { ans.push_back(par[n][c]); c=c/par[n][c]; n--; } ans.push_back(c); reverse(ans.begin(), ans.end()); return ans; } int main() { ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); sieve(); int T; cin>>T; while(T--) { int n,c; cin>>n>>c; vector ans; for(int i=1;i<=n;++i) { vector akt=build(i, c); int pos=-1; for(int j=0;j<(int)akt.size();++j) { if(akt[j]==1) pos=j; } if(i==n) ans=akt; else if(akt[0]==1) { reverse(akt.begin(), akt.end()); while((int)akt.size()=0) { for(int j=0;j