Cod sursa(job #2582130)

Utilizator Andrei_CotorAndrei Cotor Andrei_Cotor Data 16 martie 2020 14:00:12
Problema NumMst Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<fstream>

using namespace std;

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

int E[2500],Primes[2500],Dp[2500],Prv[2500];

int main()
{
    int n;
    fi>>n;

    int nr,gcd;
    for(int i=2; i*i<=n; i++)
    {
        if(n%i==0)
        {
            nr=i;
            gcd=n/i;
            break;
        }
    }

    int nrp=0;
    for(int i=2; i<=nr; i++)
    {
        if(E[i])
            continue;

        Primes[++nrp]=i;

        for(int j=i+i; j<=nr; j+=i)
            E[j]=1;
    }

    Dp[0]=1;
    for(int i=1; i<=nrp; i++)
    {
        for(int j=nr-Primes[i]; j>=0; j--)
        {
            int p=Primes[i];
            while(p+j<=nr)
            {
                if(p==nr)
                    break; //nu vreau sa am o singura gramada

                if(Dp[j+p]<Dp[j]*p)
                {
                    Dp[j+p]=Dp[j]*p;
                    Prv[j+p]=j;
                }

                p=p*Primes[i];
            }
        }
    }

    int ind=0;
    for(int i=1; i<=nr; i++)
    {
        if(Dp[i]>Dp[ind])
            ind=i;
    }

    for(int i=1; i<=nr-ind; i++)
        fo<<gcd<<" ";

    while(ind!=0)
    {
        fo<<(ind-Prv[ind])*gcd<<" ";
        ind=Prv[ind];
    }

    fo<<"\n";
    fi.close();
    fo.close();
    return 0;
}