Cod sursa(job #968529)

Utilizator darrenRares Buhai darren Data 2 iulie 2013 11:33:12
Problema NumMst Scor 17
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <cmath>
#include <fstream>
#include <algorithm>

using namespace std;

int N;
bool isprim[3200];
double val[3200], maxH[3200][2];
int T[3200][2];

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

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

    fin >> N;

    int cmmdc = 0;
    for (int i = 2; i * i <= N; ++i)
        if (N % i == 0)
            cmmdc = max(cmmdc, N / i);

    int M = N / cmmdc;

    maxH[0][0] = val[1];
    maxH[1][0] = val[1];
    T[1][0] = 1;

    for (int i = 2; i <= M; ++i)
    {
        maxH[i][0] = maxH[i][1] = -1;
        for (int j = 1; j <= i; ++j)
        {
            if (j != i && !isprim[j] && maxH[i][1] < maxH[i - j][0] + val[j])
            {
                maxH[i][1] = maxH[i - j][0] + val[j];
                maxH[i][0] = maxH[i][1];
                T[i][1] = T[i][0] = j;
            }
            else if (!isprim[j] && maxH[i][0] < maxH[i - j][0] + val[j])
            {
                maxH[i][0] = maxH[i - j][0] + val[j];
                T[i][0] = j;
            }
        }
    }

    int now = M;
    bool firsttime = true;

    while (now != 0)
    {
        if (firsttime)
        {
            fout << cmmdc * T[now][1] << ' ';
            now -= T[now][1];
            firsttime = false;
        }
        else
        {
            fout << cmmdc * T[now][0] << ' ';
            now -= T[now][0];
        }
    }

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