Cod sursa(job #2528489)

Utilizator LeVladzCiuperceanu Vlad LeVladz Data 21 ianuarie 2020 23:04:16
Problema NumMst Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>
#include <cmath>

using namespace std;

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

int n,i,j,prim[460],tata[460][3205];
bool w[3205];
double d[460][3205];

int main()
{
    fin >> n; int cmmdc = 0;
    for (i=2; i*i<=n; i++)
        if (n%i == 0)
        {
            cmmdc = n/i;
            break;
        }
    n /= cmmdc;
    w[0] = w[1] = 1; int k = 1; prim[1] = 2;
    for (i=2; i<=n; i+=2)
        if (w[i] == 0)
        {
            prim[++k] = i;
            for (j=i+i; j<=n; j+=i)
                w[j] = 1;
        }
    for (i=1; i<=k; i++)
    {
        for (j=1; j<=n; j++)
            d[i][j] = max(d[i][j], d[i-1][j]);
        if (prim[i] > n)
            break;
        for (j=0; j<=n; j++)
        {
            int val = prim[i];
            while (j+val <= n)
            {
                if (d[i-1][j]+log(val) > d[i][j+val])
                {
                    d[i][j+val] = d[i-1][j]+log(val);
                    tata[i][j+val] = val;
                }
                val *= prim[i];
            }
        }
    }
    while (i > 1)
    {
        if (tata[i][n] > 0)
        {
            fout << tata[i][n]*cmmdc << " ";
            n -= tata[i][n];
        }
        i--;
    }
    while (n > 0)
    {
        fout << cmmdc << " ";
        n--;
    }
    return 0;
}