Cod sursa(job #2528360)

Utilizator robx12lnLinca Robert robx12ln Data 21 ianuarie 2020 19:43:50
Problema NumMst Scor 95
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<bits/stdc++.h>
using namespace std;

ifstream fin("nummst.in");
ofstream fout("nummst.out");

const int DIM = 460;
const int VMAX = 3300;

int N, dmx, M;
double Dp[DIM][VMAX];
int T[DIM][VMAX];
vector<int> Primes;
bool f[VMAX];

void answer( int i, int j ){
    if( i == 0 ){
        while( j != 0 ){
            fout << dmx << " ";
            j--;
        }
        return;
    }
    answer( i - 1, j - T[i][j] );
    if( T[i][j] != 0 )
        fout << 1LL * dmx * T[i][j] << " ";
}

int main(){

    fin >> N;
    for( int i = 2; i * i <= N; i++ ){
        if( N % i == 0 )
            dmx = max( dmx, max(i, N / i) );
    }

    M = N / dmx;
    for( int i = 2; i < M; i++ ){
        if( f[i] == false ){
            Primes.push_back( i );
            for( int j = i + i; j <= M; j += i )
                f[j] = true;
        }
    }

    for( int i = 0; i < Primes.size(); i++ ){

        for( int j = 1; j <= M; j++ )
            Dp[i + 1][j] = Dp[i][j];

        int p = Primes[i];
        while( p <= M ){
            for( int j = 0; j + p <= M; j++ ){
                if( Dp[i + 1][j + p] < Dp[i][j] + log(p) ){
                    Dp[i + 1][j + p] = Dp[i][j] + log(p);
                     T[i + 1][j + p] = p;
                }
            }
            p *= Primes[i];
        }

    }

    answer( Primes.size(), M );
    return 0;
}