Cod sursa(job #1436434)

Utilizator timicsIoana Tamas timics Data 15 mai 2015 21:42:57
Problema NumMst Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#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;
}