#include <iostream> #include <math.h> #include <vector> #include <map> #include <sstream> using namespace std; struct NODE{ int cnt; //map<int,int> freq; vector<int> num; int freq[35]; }node[33000]; int prime[33000]; vector<int> v; stringstream s; int _pow(int a,int p) { if(p==0) return 1; return a*_pow(a,p-1); } int factorize() { int tmp,index; int prev=-1; int counter=0; for(int i=3;i<33000;i++) { prev=-1; counter=0; if(prime[i]==0 && i%2!=0) { if(prev==i) { node[i].freq[counter-1]++; } else { prev=i; node[i].freq[counter++]++; node[i].num.push_back(prev); } //node[i].freq[i]++; continue; } tmp=i; index=0; while(tmp>=(v[index]*v[index])) { if(tmp%v[index]==0) { tmp/=v[index]; if(prev==v[index]) { node[i].freq[counter-1]++; } else { prev = v[index]; node[i].freq[counter++]++; node[i].num.push_back(prev); } //node[i].freq[v[index]]++; index=-1; } index+=1; } if(tmp>1) { if(prev==tmp) { node[i].freq[counter-1]++; } else { prev=tmp; node[i].freq[counter++]++; node[i].num.push_back(prev); } //node[i].freq[tmp]++; } node[i].cnt=counter; } return 0; } int main() { string str; double p = sqrt(33000)+4; for(int i=3;i<p;i+=2) { if(prime[i]==0) { for(int j=i+i;j<33000;j+=i) prime[j]=1; } } v.clear(); v.push_back(2); for(int j=3;j<33000;j++) { if(prime[j]==0 && j%2!=0) v.push_back(j); } factorize(); int n,numb; int a,b; while(1) { getline(cin,str); if(str=="0") break; istringstream s(str); int c=0; numb=1; while(s>>n) { if(c==0) { a=n; c=1; } else if(c) { b=n; c=0; numb*=_pow(a,b); } } NODE tNode = node[numb-1]; //cout<<tNode.num.size()<<"\n"; //cout<<tNode.num[5]<<" "<<tNode.freq[5]<<"\n"; //for(int i=node[numb-1].num.size()-1;i>=0;i++) for(int i=(tNode.num.size()-1);i>=0;i--) { cout<<tNode.num[i]<<" ";//cout<<ii->first<<" "<<ii->second<<" "; if(i) cout<<tNode.freq[i]<<" "; else cout<<tNode.freq[i]<<"\n"; } } return 0; }