Cod sursa(job #2527565)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 20 ianuarie 2020 17:10:23
Problema NumMst Scor 72
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <bits/stdc++.h>
#define DIMN 10000
using namespace std;
int elem;
int c[DIMN] , sol[DIMN];
int prm[DIMN] , found[600][4010];
double rcs[600][4010];
pair <double , int> maxi[4010];
pair <int,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);
    //found[0] = 1;
    for ( i = 0 ; i <= n ; i++ ){
        rcs[0][i] = 0;
        tt[0][i] = make_pair(i-1 , 0);
        found[0][i] = 1;
    }
    //cout <<log((double)8); //+ log((double)3)+log((double)5)+log((double)7);
    for (i = 1 ; i <= elem ; i++){

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

            for (j = n - nr ; j>=0 ; j--){ /// iau de la un nr prim anterior
               // if (nr == 8 && ! j)
               // printf ("a");
                if (found[i-1][j] && maxi[j].first + log((double)nr) > rcs[i][j + nr]){
                    if (j == 0 && nr == n)
                        continue;
                    found[i][j + nr] = 1;
                    rcs[i][j + nr] = maxi[j].first + log((double)nr);
                    tt[i][j + nr] = make_pair(j , maxi[j].second);
                }
            }

        }

        for (j = 1 ; j <= n ; j++){ /// iau de la un nr prim anterior
            if (maxi[j].first < rcs[i][j]){
                maxi[j] = make_pair(rcs[i][j] , i);
            }
        }

    }
    sum = n;
    int poz = maxi[n].second;
    int xc = 0;
    pair <int,int> aux;
    int s = 0;
    while (sum){
        sol[++xc] = sum - tt[poz][sum].first;
        aux = tt[poz][sum];
        sum = aux.first;
        poz = aux.second;
    }
    for ( i = xc ; i ; i-- ){
        fprintf (fout,"%d " , sol[i] * dmare);
    }
    return 0;
}