Cod sursa(job #2528208)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 21 ianuarie 2020 17:12:29
Problema NumMst Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include<fstream>
#include<cmath>
#include<iostream>
using namespace std;
int n, k, ii, i, j, nr, p, np, nii;
int v[3500], c[3500], ok[4000];
pair<int, int> t[500][3500];
double d[500][3500];
ifstream fin("nummst.in");
ofstream fout("nummst.out");
int main(){
    fin>> n;
    for(i = 2; i <= n; i++){
        if(n % i == 0){
            k = i;
            break;
        }
    }
    if(k == 2){
        fout<< n / 2 <<" "<< n / 2 <<"\n";
        return 0;
    }
    for(i = 0; i <= k; i++){
        d[0][i] = -1;
    }
    ok[1] = 1;
    for(i = 2; i < k; i++){
        if(c[i] == 1){
            continue;
        }
        p++;
        for(j = i + i; j <= k; j += i){
            c[j] = 1;
        }
        for(ii = 0; ii <= k; ii++){
            d[p][ii] = d[p - 1][ii];
            t[p][ii] = t[p - 1][ii];
            for(j = i; ii - j >= 0; j *= i){
                if(d[p - 1][ii - j] != -1){
                    if(d[p][ii] < d[p - 1][ii - j] + log(j) ){
                        d[p][ii] = d[p - 1][ii - j] + log(j);
                        t[p][ii] = make_pair(p - 1, ii - j);
                    }
                }
                if(ok[ii - j] == 1){
                    if(d[p][ii] < log(j) + log(ii - j) ){
                        d[p][ii] = log(j) + log(ii - j);
                        t[p][ii] = make_pair(0, j);
                    }
                }
            }
        }
        for(j = i; j <= k; j *= i){
            ok[j] = 1;
        }
    }
    ii = 0;
    for(i = 1; i <= k; i++){
        if(d[p][i] > d[p][ii]){
            ii = i;
        }
    }
    if(ii != k){
        v[++nr] = k - ii;
    }
    while(p != 0){
        v[++nr] = ii - t[p][ii].second;
        np = t[p][ii].first;
        nii = t[p][ii].second;
        p = np;
        ii = nii;
    }
    v[++nr] = ii;
    for(i = 1; i <= nr; i++){
        fout<< v[i] * n / k <<" ";
    }
    return 0;
}