Cod sursa(job #2582173)

Utilizator Andrei_CotorAndrei Cotor Andrei_Cotor Data 16 martie 2020 14:34:32
Problema NumMst Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#include<fstream>
#include<math.h>

using namespace std;

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

int E[3200],Primes[3200];
double Dp[505][3200]; //trb matrice ca sa nu imi schimbe valoarea la Prv acelasi nr prim, chiar daca per total e mai pt suma valoarea respectiva, aici nu e
pair<int,int> Prv[505][3200];

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;
    }

    for(int i=1; i<=nr; i++)
        Dp[0][i]=-1;

    Dp[0][0]=0;
    for(int i=1; i<=nrp; i++)
    {
        for(int j=1; j<=nr; j++)
        {
            Dp[i][j]=Dp[i-1][j];
            Prv[i][j]=Prv[i-1][j];
        }

        for(int j=nr-Primes[i]; j>=0; j--)
        {
            double init=log10(1.0*Primes[i]);
            double plg=init;
            int p=Primes[i];

            while(p+j<=nr)
            {
                if(p==nr)
                    break; //nu vreau sa am o singura gramada

                if(Dp[i][j+p]<Dp[i-1][j]+plg)
                {
                    Dp[i][j+p]=Dp[i-1][j]+plg;
                    Prv[i][j+p]={i-1,j};
                }

                plg=plg+init;
                p=p*Primes[i];
            }
        }
    }

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

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

    int line=nrp;
    while(ind!=0)
    {
        fo<<(ind-Prv[line][ind].second)*gcd<<" ";

        int x=line;
        int y=ind;
        line=Prv[x][y].first;
        ind=Prv[x][y].second;
    }

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