Cod sursa(job #587748)

Utilizator SpiderManSimoiu Robert SpiderMan Data 5 mai 2011 19:34:17
Problema NumMst Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
# 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 ) ;
    }
}