Cod sursa(job #2527588)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 20 ianuarie 2020 17:59:20
Problema NumMst Scor 45
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <bits/stdc++.h>
#define DIM 1010
using namespace std;

ifstream fin ("nummst.in");
ofstream fout ("nummst.out");
int ciur[DIM],p[DIM];
int sol[DIM][DIM],ok[DIM][DIM];
pair <int,int> t[DIM][DIM];
double dp[DIM][DIM];
vector <int> ans;
int n,i,j,k,d,nr;
int main (){

    fin>>n;

    for (i=2;i*i<=n;i++)
        if (n%i == 0)
            break;
    d = n/i;
    n = i;
    for (i=2;i<=n;i++){
        if (!ciur[i]){
            for (j=i+i;j<=n;j+=i)
                ciur[j] = 1;
            p[++k] = i;
        }
    }

    /// dp[i][j] - cmmmc ul maxim daca il scriu pe i ca suma de puteri de nr prime
    /// cu factori primi din primii j

    ok[0][0] = 1;
    dp[0][0] = log(1);

    for (j=1;j<=k;j++){

        /// nu iau nimic de la factorul asta
        for (i=1;i<=n;i++)
            dp[i][j] = dp[i][j-1];

        int nr = p[j];
        while (nr <= n){

            for (i=n;i>=nr;i--){

                if (dp[i-nr][j-1] + log(nr) > dp[i][j]){
                    dp[i][j] = dp[i-nr][j-1] + log(nr);
                    sol[i][j] = nr; /// tin minte din ce obtin starea i,j
                }
            }

            nr *= p[j];
        }


    }

    double maxi = 0;
    int poz = 0;
    for (i=1;i<=k;i++){
        if (dp[n][i] > maxi){
            maxi = dp[n][i];
            poz = i;
        }
    }

    int x = n;
    while (x && poz){
        if (sol[x][poz]){
            ans.push_back(sol[x][poz]*d);
            x -= sol[x][poz];
        }
        poz--;
    }
    while (x){ /// trb sa ma asigur ca suma da n
        ans.push_back(d);
        x--;
    }
    /*double maxi = 0;
    int poz = 0, poz2 = 0;
    for (i=1;i<=n;i++){
        for (j=1;j<=k;j++)
            if (dp[i][j] > maxi){
                maxi = dp[i][j];
                poz = i, poz2 = j;
            }
    }

    int x = poz, y = poz;
    while (x){
        ans.push_back(sol[x][y]*d);
        //fout<<sol[x]*d<<" ";
        int aux_x = t[x][y].first;
        int aux_y = t[x][y].second;
        x = aux_x, y = aux_y;
    }*/

    if (ans.size() > 1){
        sort (ans.begin(),ans.end());
        for (auto it:ans)
            fout<<it<<" ";
        return 0;
    }
    for (i=1;i<=n;i++)
        fout<<d<<" ";



    return 0;
}