Cod sursa(job #1745526)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 22 august 2016 02:21:06
Problema NumMst Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

ifstream cin("nummst.in");
ofstream cout("nummst.out");

const double EPS = 1e-5;

bool notPrime[5000];
double dp[600][5000];
vector<int> primes;

int main() {
    int n, gcd;
    cin >> n;
    for (int i = 2; i < n; i++)
        if (n % i == 0) {
            gcd = n / i;
            break;
        }
    n /= gcd;
    if (n == 2) {
        cout << gcd << " " << gcd << "\n";
        return 0;
    }
    if (n == 3) {
        cout << gcd << " " << 2 * gcd << "\n";
        return 0;
    }
    for (int i = 2; i <= n && i <= 200; i++)
        if (!notPrime[i]) {
            primes.push_back(i);
            for (int j = 2 * i; j <= n; j += i)
                notPrime[j] = true;
        }
    for (int i = 0; i < primes.size(); i++) {
        int p = primes[i];
        for (int j = 1; j <= n; j++) {
            dp[i + 1][j] = dp[i][j];
            int power = 1;
            while (power <= j) {
                if (log(power) + dp[i][j - power] > dp[i + 1][j])
                    dp[i + 1][j] = log(power) + dp[i][j - power];
                power *= p;
            }
        }
    }
    double lcm = 0;
    int where;
    for (int i = 1; i <= n; i++)
        if (lcm < dp[primes.size()][i]) {
            lcm = dp[primes.size()][i];
            where = i;
        }
    if (where != n)
        cout << (n - where) * gcd << " ";
    for (int i = primes.size(); i >= 1; i--) {
        int p = primes[i - 1];
        int power = p;
        while (power <= where) {
            if (abs(log(power) + dp[i - 1][where - power] - dp[i][where]) <= EPS) {
                cout << power * gcd << " ";
                where -= power;
                break;
            }
            power *= p;
        }
    }
    return 0;
}