Cod sursa(job #2527462)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 20 ianuarie 2020 13:39:25
Problema NumMst Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 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;
        }

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

    for (i = 1 ; i <= elem ; i++){

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

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

                }
            }

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

        }


    }
    sum = n;
    int x = 0;
    while (sum){
        sol[++x] = sum - tt[sum];
        sum = tt[sum];
    }

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