Cod sursa(job #2527545)

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

ifstream fin ("nummst.in");
ofstream fout ("nummst.out");
int ciur[DIM],p[DIM];
int t[DIM],sol[DIM],ok[DIM];
double dp[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[0] = log(1);
    dp[0] = log(1);
    ok[0] = 1;
    for (j=k;j;j--){
        for (i=n;i;i--){
            if (ok[i-1] && dp[i-1] + log(1) > dp[i]){
                dp[i] = dp[i-1] + log(1);
                t[i] = i-1;
                sol[i] = ok[i] = 1;
            }
            int nr = p[j];
            while (nr <= i){

                if (ok[i-nr] && dp[i-nr] + log(nr) > dp[i]){
                    dp[i] = dp[i-nr] + log(nr);
                    t[i] = i-nr;
                    sol[i] = nr;
                    ok[i] = 1;
                }

                nr *= p[j];
            }
        }
    }

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

    int x = poz;
    while (x){
        ans.push_back(sol[x]*d);
        //fout<<sol[x]*d<<" ";
        x = t[x];
    }
    for (i=poz+1;i<=n;i++)
        ans.push_back(d);

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