Cod sursa(job #2527469)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 20 ianuarie 2020 13:50:15
Problema NumMst Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <bits/stdc++.h>
#define DIMN 10000
using namespace std;
int elem;
int c[DIMN] , sol[DIMN];
int tt[DIMN] , prm[DIMN] , found[DIMN];
double rcs[DIMN];
void ciur (int n){
    int i , j;
    for (i = 2 ; i <= n ; i++){
        if (!c[i]){
            prm[++elem] = i;
            for (j = 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 , dmic , dmare , i , j , nr , sum;
    fscanf (fin,"%d",&n);
    d = 2;
    while (d * d <= n){

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

        d++;

    }
    /// suma trb sa fie dmic , adica acum n
    n /= dmare;

    ciur (n);

    //found[0] = 1;
    rcs[0] = -1;
    for ( i = 1 ; i <= n ; i++ ){
        rcs[i] = 0;
        tt[i] = i-1;
        found[i] = 1;
    }
    /// 21 28 -> 3 4 -> sum 7
    for (i = 1 ; i <= elem ; i++){

        nr = prm[i];

        if (!found[nr] || rcs[nr] < log((double)nr)){
            found[nr] = 1;
            rcs[nr] = log((double)nr);
            tt[nr] = 0;
        }

        for (j = 1 ; j + nr <= n ; j++){
            //if (j == 3 && nr == 2)
                //  printf ("%lf\n" ,log((double)nr) );
            if (found[j] && rcs[j] + log((double)nr) > rcs[j + nr]){
                    //printf ("intra\n");
                found[j + nr] = 1;
                rcs[j + nr] = rcs[j] + log((double)nr);
                tt[j + nr] = j;

            }
        }


    }
    sum = n;
    int xc = 1;
    int ant = -1;
    while (sum){
        if (sum - tt[sum] != ant)
            sol[++xc] = sum - tt[sum];
        else sol[xc] += (sum - tt[sum]);
        ant = sum - tt[sum];
        sum = tt[sum];
    }

    for ( i = xc ; i ; i-- ){
        if (sol[i])
            fprintf (fout,"%d " , sol[i] * dmare);
    }
    return 0;
}