Cod sursa(job #585994)

Utilizator mottyMatei-Dan Epure motty Data 30 aprilie 2011 13:06:00
Problema NumMst Scor 10
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Clasele 10-12 Marime 1.49 kb
#include <fstream>

using namespace std;

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

const int N = 350001;
const int M = 5000001;

int n;
int dvvv;
int nd;
int bs;
int rcm;
int pcm;
int ds[N];

bool ciur[M];

int sol[N];
int bSol[N];

int GMD()
{
    for (int i = 2; i <= n; ++i)
        if (n % i == 0)
            return i;
	return 54321;
}

void SD()
{
    for (int i = 2; i < dvvv; ++i)
        if (!ciur[i])
        {
            ds[++nd] = i;
            //out << divv[dc] << "\n";

            for (int j = i + i; j < dvvv; j += i)
                ciur[j] = true;
        }
}

void Check(int poss, int remm)
{
    int bAct = 1;
    for (int i = 1; i < poss; ++i)
        if (sol[i])
            bAct *= sol[i] * ds[i];

    if (bAct > bs)
    {
        bs = bAct;
        pcm = poss;
        rcm = remm;
        for (int i = 1; i < poss; ++i)
            bSol[i] = sol[i];
    }
}

void GD(int poss, int remm)
{
    if (poss > nd || remm < ds[poss])
    {
        Check(poss, remm);
        return;
    }

    for (int i = 0; i * ds[poss] <= remm; ++i)
    {
        sol[poss] = i;
        GD(poss + 1, remm - i * ds[poss]);
    }
}

void Print()
{
    int kk = n / dvvv;
    for (int i = 1; i < pcm; ++i)
        if (bSol[i])
            out << bSol[i] * ds[i] * kk << " ";
    if (rcm)
        out << rcm * kk << "\n";
}

int main()
{
	in >> n;
	dvvv = GMD();
	SD();
	GD(1, dvvv);
	Print();

	return 0;
}