Cod sursa(job #968601)

Utilizator darrenRares Buhai darren Data 2 iulie 2013 12:54:05
Problema NumMst Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <cmath>
#include <cstring>
#include <fstream>
#include <algorithm>

using namespace std;

int N;
int ST[3200];
bool isprim[3200];
double val[3200], maxH[2][3200];
short T[502][3200];
int result[3200];

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

    for (int i = 2; i < 3200; ++i)
        if (!isprim[i])
        {
            ST[++ST[0]] = i;
            for (int j = i * i; j < 3200; j += i)
                isprim[j] = true;
        }
    for (int i = 1; i < 3200; ++i)
        val[i] = log(double(i));

    fin >> N;

    int cmmdc = 0;
    for (int i = 2; i * i <= N; ++i)
        if (N % i == 0)
        {
            cmmdc = N / i;
            break;
        }

    int M = N / cmmdc;

    int act = 0;
    for (int i = 0; i <= M; ++i)
        maxH[act][i] = val[1];

    int maxgo = 0;
    for (int i = 1; ST[i] < M; ++i)
    {
        ++maxgo;

        act = !act;
        for (int j = 0; j <= M; ++j)
        {
            maxH[act][j] = maxH[!act][j];
            T[i][j] = 0;
        }

        for (int j = 1; j <= M; ++j)
            for (int valnow = ST[i]; valnow <= j; valnow *= ST[i])
            {
                if (maxH[!act][j - valnow] + val[valnow] > maxH[act][j])
                {
                    maxH[act][j] = maxH[!act][j - valnow] + val[valnow];
                    T[i][j] = valnow;
                }
            }
    }

    int inow = maxgo, jnow = M;
    while (inow != 0)
    {
        if (T[inow][jnow] != 0) result[++result[0]] = cmmdc * T[inow][jnow];
        jnow = jnow - T[inow][jnow];
        --inow;
    }
    for (int i = 1; i <= jnow; ++i)
        result[++result[0]] = cmmdc;

    sort(result + 1, result + result[0] + 1);
    for (int i = 1; i <= result[0]; ++i)
        fout << result[i] << ' ';
    fout << '\n';

    fin.close();
    fout.close();
}