Cod sursa(job #2527596)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 20 ianuarie 2020 18:06:40
Problema NumMst Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 kb
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define DIMN 10000
using namespace std;
int elem;
int c[DIMN] , sol[DIMN];
int prm[DIMN];
double rcs[600][4010];
pair <double , int> maxi[4010];
int tt[600][4010];
void ciur (int n){
    int i , j;
    for (i = 2 ; i <= n ; i++){
        if (!c[i]){
            prm[++elem] = i;
            for (j = i*i ; j <= n ; j += i){
                c[j] = 1;
            }
        }
    }


}
int main()
{
    FILE *fin = fopen ("nummst.in","r");
    FILE *fout = fopen ("nummst.out","w");
    int n , d , dmare , i , j , nr , sum , dmic;
    fscanf (fin,"%d",&n);
    d = 2;
    while (d * d <= n){

        if (n % d == 0){
            dmare = n / d;
            dmic = d;
            break;
        }

        d++;

    }
    /// suma trb sa fie dmic , adica acum n
    n /= dmare;
    ciur (n);
    //cout <<log((double)8); //+ log((double)3)+log((double)5)+log((double)7);
    for (i = 1 ; i <= elem ; i++){

        for (j = 0 ; j <= n ; j++){ /// iau de la un nr prim anterior
            rcs[i][j] = rcs[i-1][j]; /// tot o sa faci un maxi
            tt[i][j] = tt[i-1][j];
        }

        for (nr = prm[i] ; nr < n ; nr *= prm[i]){

            for (j = n - nr ; j>=0 ; j--){ /// iau de la un nr prim anterior
                if (rcs[i-1][j] + log((double)nr) > rcs[i][j + nr]){
                    rcs[i][j + nr] = rcs[i-1][j] + log((double)nr);
                    tt[i][j + nr] = j;
                }
            }

        }

    }
    sum = n;
    int poz = elem;
    int xc = 0;
    int s = 0;
    while (sum && poz){
        if (tt[poz][sum] && tt[poz][sum] == tt[poz - 1][sum])
            poz--; /// aici stii ca nu ai luat
        else {
            fprintf (fout,"%d ",(sum - tt[poz][sum]) * dmare);
            s += sum - tt[poz][sum];
            sum = tt[poz][sum];
            poz--;
        }
    }
    while (s < dmic){
        fprintf (fout,"%d ",dmare);
        s++;
    }
    return 0;
}