Cod sursa(job #968531)

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

using namespace std;

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

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

    ST[++ST[0]] = 1;
    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(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 k = 1; ST[k] <= i; ++k)
        {
            int j = ST[k];
            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();
}