Cod sursa(job #2528507)

Utilizator LeVladzCiuperceanu Vlad LeVladz Data 21 ianuarie 2020 23:38:20
Problema NumMst Scor 85
Compilator cpp-32 Status done
Runda Arhiva de probleme Marime 1.34 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],v[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; int k = 0;
    if (2 < n)
        prim[++k] = 2;
    for (i=3; 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] = d[i-1][j];
        if (prim[i] > n)
            break;
        int val = prim[i];
        while (val <= n)
        {
            for (j=0; j<=n-val; j++)
                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];
        }
    }
    i--;
    while (i > 0)
    {
        if (tata[i][n] > 0)
        {
            fout << tata[i][n]*cmmdc << " ";
            n -= tata[i][n];
        }
        i--;
    }
    while (n > 0)
    {
        fout << cmmdc << " ";
        n--;
    }
    return 0;
}