Pagini recente » Cod sursa (job #2038686) | Cod sursa (job #1844269) | Cod sursa (job #2055405) | Cod sursa (job #2452297) | Cod sursa (job #587749)
Cod sursa(job #587749)
# include <algorithm>
# include <cstdio>
# include <cmath>
# include <vector>
using namespace std ;
# define pb push_back
const char *FIN = "nummst.in", *FOU = "nummst.out" ;
unsigned char V[1 << 20];
double mat[600][4100] ;
vector < int > sol ;
int P[600], N, gr ;
int main (void) {
fscanf ( fopen (FIN, "r"), "%d", &N ) ;
for ( int i = 2; i * i <= N; ++i ) {
if ( N % i ) continue ;
gr = N / i, N = i ;
}
P[ ++P[0] ] = 2 ;
for (int i = 1; ( i * i << 1 ) + ( i << 1 ) <= N; ++i) {
if ( ( V[i >> 3] & ( 1 << ( i & 7 ) ) ) ) continue;
for (int j = ( i * i << 1 ) + ( i << 1 ); ( j << 1 ) + 1 <= N; j += ( i << 1 ) + 1) {
V[j >> 3] |= ( 1 << ( j & 7 ) );
}
}
for (int i = 1; ( i << 1 ) + 1 <= N; ++i) {
if ( ( V[i >> 3] & ( 1 << ( i & 7 ) ) ) == 0 ) {
P[ ++P[0] ] = ( i << 1 ) + 1 ;
}
}
for ( int i = 1; i <= P[0]; ++i ) {
for ( int j = 1; j <= N; ++j ) {
mat[i][j] = mat[i - 1][j] ;
for ( int div = P[i]; div <= j; div *= P[i] ) {
mat[i][j] = max (mat[i][j], log (1.0 * div) + mat[i - 1][j - div]) ;
}
}
}
int j = N ;
for ( int i = P[0] ; i > 0; --i ) {
if ( mat[i][j] > mat[i - 1][j] ) {
for ( int div = P[i]; div <= j; div *= P[i] ) {
if ( mat[i][j] <= mat[i - 1][j - div] + log (1.0 * div) ) {
j -= div, sol.pb (div) ;
break ;
}
}
}
}
for ( ; j > 0; --j, sol.pb (1) ) ;
sort ( sol.begin (), sol.end () ) ;
freopen (FOU, "w", stdout) ;
for ( int i = 0, j = sol.size (); i < j; ++i ) {
printf ( "%d ", sol[i] * gr ) ;
}
}