Pagini recente » Cod sursa (job #117127) | Cod sursa (job #931507) | Cod sursa (job #2630578) | Cod sursa (job #1019171) | Cod sursa (job #968287)
Cod sursa(job #968287)
#include<stdio.h>
#include<cmath>
#define maxdim 3165
#define maxprimes 500
FILE*f=fopen("nummst.in","r");
FILE*g=fopen("nummst.out","w");
int n;
int pr[maxprimes],ciur[maxdim],T[maxprimes][maxdim],sol[maxprimes];
double D[2][maxprimes];
int main () {
fscanf(f,"%d",&n);
int factor = 0,cmmdc = 0;
for ( int i = 2 ; i*i <= n ; ++i ){
if ( n%i == 0 ){
factor = i,cmmdc = n/i;
break ;
}
}
n /= cmmdc;
for ( int i = 2 ; i <= n ; ++i ){
if ( !ciur[i] ){
pr[++pr[0]] = i;
for ( int j = i+i ; j <= n ; j += i ){
ciur[j] = 1;
}
}
}
int p = 0;
for ( int i = 1 ; i <= pr[0] ; ++i ){
double lg = log((double)pr[i]);
for ( int j = 0 ; j <= n ; ++j ){
int s = 1;
for ( int power = 0 ; j+s <= n ; ++power ){
if ( D[p][j] + power*lg > D[1-p][j+s] ){
D[1-p][j+s] = D[p][j] + power*lg;
T[i][j+s] = power;
}
s *= pr[i];
}
}
p = 1-p;
for ( int j = 1 ; j <= n ; ++j ){
D[1-p][j] = 0;
}
}
int sum = n; p = pr[0];
while ( sum && p >= 1 ){
int power = T[p][sum];
if ( !power ){
--p;
continue ;
}
int scad = 1;
for ( int i = 1 ; i <= power ; ++i ) scad *= pr[p];
sol[++sol[0]] = cmmdc*scad;
sum -= scad; --p;
}
for ( int i = sol[0]+1 ; i <= factor ; ++i ){
sol[++sol[0]] = cmmdc;
}
for ( int i = 1 ; i <= sol[0] ; ++i ){
fprintf(g,"%d ",sol[i]);
}
fprintf(g,"\n");
fclose(f);
fclose(g);
return 0;
}