Cod sursa(job #1758665)

Utilizator akaprosAna Kapros akapros Data 17 septembrie 2016 17:05:37
Problema NumMst Scor 9
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <bits/stdc++.h>
#define maxN 10000002
#define maxM 3164
using namespace std;
int n, d, m, prime[maxM], prv[maxM][2];
bool b[maxM];
double dp[2][maxM];
void read()
{
    freopen("nummst.in", "r", stdin);
    scanf("%d", &n);
}
void sieve()
{
    int i, j;
    for (i = 2; i < n; ++ i)
        if (!b[i])
        {
            prime[++ prime[0]] = i;
            for (j = i * i; j < n; ++ j)
                b[j] = 0;
        }
}
void Dp()
{
    int i, j, t = 0;
    for (i = 1; i <= n; ++ i)
    {
        prv[i][0] = i;
        prv[i][1] = 0;
    }
    for (i = 1; i <= prime[0]; ++ i)
    {
        t = !t;
        for (j = 1; j <= n; ++ j)
        {
            dp[t][j] = 1.0 * dp[!t][j];

            double x = log10f(prime[i]);
            if (j > 2 * prime[i] && dp[!t][j - 2 * prime[i]] + 2.0 * x > dp[t][j])
            {
                dp[t][j] = dp[!t][j - 2 * prime[i]] + 2.0 * x;

                printf("%.5lf", dp[t][j]);
                prv[j][0] = 2;
                prv[j][1] = j - 2 * prime[i];
            }
            if (j > prime[i] && dp[!t][j - prime[i]] + 1.0 * x > dp[t][j])
            {

                printf("%.5lf", dp[t][j]);
                dp[t][j] = dp[!t][j - prime[i]] + 1.0 * x;
                prv[j][0] = 1;
                prv[j][1] = j - prime[i];
            }
        }
    }
}
void solve()
{
    int i;
    for (i = 2; i * i <= n; ++ i)
        if (n % i == 0)
        {
            d = n / i;
            break;
        }
    if (!d)
        d = 1;
    else
        n = i;
    sieve();
    Dp();
}
void write()
{
    int i = n;
    freopen("nummst.out", "w", stdout);
    while (i)
    {
        for (int j = 1; j <= prv[i][0]; ++ j)
            printf("%d ", d * (i - prv[i][1]) / prv[i][0]);
        i = prv[i][1];
    }
}
int main()
{
    read();
    solve();
    write();
    return 0;
}