Pagini recente » Cod sursa (job #1441468) | Cod sursa (job #386823) | Cod sursa (job #1598456) | Clasament oji2009 | Cod sursa (job #1436434)
#include<stdio.h>
#include<vector>
#include<math.h>
using namespace std;
int N, g=1;
double d[600][4000];
vector<int> primes;
bool pr[4000];
int main() {
freopen("nummst.in","r",stdin);
freopen("nummst.out","w",stdout);
scanf("%d",&N);
for(int i=2;i<N;++i) {
if(N%i == 0) {
g = N/i;
break;
}
}
N = N/g;
if(N==2) {
printf("%d %d\n",g,g);
return 0;
}
if(N==3) {
printf("%d %d\n",g,2*g);
return 0;
}
for(int i=2;i<=N;++i) {
if(!pr[i]) {
primes.push_back(i);
for(int j=2;i*j<=N;++j) {
pr[i*j] = 1;
}
}
}
for(int k=0;k<primes.size();++k) {
int p = primes[k];
for(int j=1;j<=N;++j) {
d[k+1][j] = d[k][j];
int pw = 1;
while(pw <= j) {
if(log(pw) + d[k][j-pw] > d[k+1][j]) {
d[k+1][j] = log(pw) + d[k][j-pw];
}
pw *= p;
}
}
}
int P = primes.size(), S = 0;
double x = 0;
for(int i=1;i<=N;++i) {
if(x < d[P][i]) {
x = d[P][i];
S = i;
}
}
if(S!=N) {
printf("%d ",(N-S)*g);
}
for(int k=P; k>=1; --k) {
int p = primes[k-1];
int pw = 1;
while(pw <= S) {
if(log(pw) + d[k-1][S-pw] == d[k][S]) {
printf("%d ",pw*g);
S = S-pw*g;
break;
}
pw *= p;
}
}
return 0;
}