Cod sursa(job #1831889)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 18 decembrie 2016 22:57:56
Problema NumMst Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#define MAXC 4000

using namespace std;

int cmmdc, n;
int viz[MAXC];
vector<int> primes;

void solve1()
{
    for (int i = 2; i*i <= n; i++)
        if (n % i == 0) {
            cmmdc = i;
            break;
        }
    primes.push_back(-1);
    for (int i = 2; i <= cmmdc; i++)
        if (!viz[i]) {
            primes.push_back(i);
            for (int j = i*i; j <= cmmdc; j += i)
                viz[j] = 1;
        }
    //primes.push_back(cmmdc+1);
}

double din[200][MAXC];
int drum[200][MAXC];

void solve2()
{
    for (int i = 1; i < MAXC; i++)
        drum[0][i] = i-1;
    for (int i = 1; i < primes.size(); i++)
    {
        for (int j = 0; j <= cmmdc; j++)
        {
            if (din[i][j] < din[i-1][j]) {
                din[i][j] = din[i-1][j];
                drum[i][j] = j;
            }
            for (int k = 1; j + k <= cmmdc-(j==0); k *= primes[i]) {
                if (din[i][j+k] <= din[i-1][j] + log(k)) {
                    din[i][j+k] = din[i-1][j] + log(k);
                    drum[i][j+k] = j;
                }
            }
        }
    }

}

void traseu()
{
    for (int i = primes.size()-1, val = cmmdc; val; i = max(0, i-1))
    {
        if (drum[i][val] != val)
            printf("%d ", (n/cmmdc)*(val-drum[i][val]));
        val = drum[i][val];
    }
}

int main()
{
    freopen("nummst.in", "r", stdin);
    freopen("nummst.out", "w", stdout);

    scanf("%d", &n);
    solve1();
    solve2();
    traseu();

    return 0;
}