Cod sursa(job #1739578)

Utilizator ancabdBadiu Anca ancabd Data 9 august 2016 19:18:54
Problema NumMst Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <fstream>
#include <cmath>

using namespace std;

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

#define MAX 3200

int n, rd, div, dmin, nr, d[MAX + 1], ind;
bool ok[MAX + 1];
double val[MAX + 1], mx[2][3200];
short t[502][3200];

void NrPrime()
{
    ok[1] = 1;
    for (int i = 1; i < MAX; i++)
    {
        if (ok[i] == 0)
        {
            d[++ind] = i;
            for (int j = i * i; j < MAX; j += i)ok[j] = 1;
        }
    }
    for (int i = 1; i < MAX; ++i)
        val[i] = log(double(i));
}
void SearchD ()
{
    rd = sqrt(n);
    div = 2;
    while (div <= rd)
    {
        if (n % div == 0)
        {
            dmin = div;
            break;
        }
        if (div == 2)div++;
        else div += 2;
    }
    nr = n/dmin;
}
int Rez()
{
    int q = 0;
    for (int i = 0; i <= nr; ++i)
        mx[q][i] = val[1];

    int mgo = 0;
    for (int i = 1; d[i] < dmin; ++i)
    {
        mgo++;
        q = !q;

        for (int j = 0; j <= dmin; ++j)
        {
            mx[q][j] = mx[!q][j];
            t[i][j] = 0;
        }

        for (int j = 1; j <= nr; ++j)
            for (int v = d[i]; v <= j; v *= d[i])
            {
                if (mx[!q][j - v] + val[v] > mx[q][j])
                {
                    mx[q][j] = mx[!q][j - v] + val[v];
                    t[i][j] = v;
                }
            }
    }
    return mgo;
}
void Afisare(int mgo)
{
    int j = dmin;
    for (int i = mgo; i > 0; i--)
    {
        if (t[i][j] != 0) fout << nr * t[i][j] << ' ';
        j -= t[i][j];
    }
    for (int i = 1; i <= j; ++i)
        fout << nr << ' ';
}
int main()
{
    fin >> n;

    NrPrime();
    SearchD();
    Afisare(Rez());
    return 0;
}