I don't know why TLE...
# include <iostream>
# include <cstdio>
# include <cstring>
# include <vector>
# include <cmath>
# define EPS 1e-8
using namespace std;
vector<int> prime;
const int MAXN = 40000;
bool p[MAXN+2];
void init() {
memset(p, true, sizeof(p));
p[0] = p[1] = false;
for(int i=2; i<MAXN; i++) {
if(p[i]) prime.push_back(i);
for(int j=0; j<prime.size() && prime[j]*i<MAXN; j++) {
p[i * prime[j]] = false;
if(i % prime[j]==0) break;
}
}
}
double f[152][MAXN+2];
int pre[152][MAXN+2];
void dp(int n) {
for(int j=0; j<=n; j++) f[0][j] = 0;
for(int i=1; i<=150; i++) {
int p = prime[i-1];
for(int j=0; j<=n; j++)
f[i][j] = f[i-1][j], pre[i][j] =j;
for(int k = p; k<=n; k*=p)
for(int j=k; j<=n; j++)
if(f[i-1][j-k] + log(k) + EPS> f[i][j]) {
f[i][j] = f[i-1][j-k] + log(k);
pre[i][j] = j-k;
}
}
}
int getdivisor(int n) {
for(int i=0; i<prime.size(); i++)
if(n % prime[i] == 0) return n / prime[i];
return 1;
}
int main() {
init();
int n; scanf("%d", &n);
int d = getdivisor(n);
dp(n = n/d);
if(n == 2)
printf("%d %d\n",d,d);
else if(n == 3)
printf("%d %d\n",d,2*d);
else {
bool flag = false;
for(int i=150,k=n; i>=0; k=pre[i][k],i--)
if(k - pre[i][k]) {
if (!flag) flag = true;
else putchar(' ');
printf("%d",d * (k-pre[i][k]));
}
puts("");
}
return 0;
}