Cod sursa(job #1522271)

Utilizator akaprosAna Kapros akapros Data 11 noiembrie 2015 14:44:19
Problema Descompuneri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxD 5002
using namespace std;
int m, k;
long long dp[maxD][maxD];
long long n, d[maxD];
void read()
{
    long long i;
    freopen("desc.in", "r", stdin);
    scanf("%lld %d", &n, &k);
    for (i = 1LL; (long long)(i * i * 1LL) <= n; ++ i)
        if (n % i == 0)
    {
        if (i != 1)
            d[++ d[0]] = i;
        if (n / i != i)
            d[++ d[0]] = n / i;
    }
    sort(d + 1, d + d[0] + 1);
}
int bs(long long x)
{
    int i = 0, p = 1 << 12;
    while (p)
    {
        if (i + p <= d[0] && d[i + p] <= x)
            i += p;
        p /= 2;
    }
    return i;
}
void solve()
{
    int i, j;
    for (i = 1; i <= (m = d[0]); ++ i)
    {
        int pos = 1;
        for (j = i; j >= 1; -- j)
    {
        if (d[i] % d[j])
        dp[i][j] = dp[i][j + 1];
            else
        {
            while (d[i] / d[j] > d[pos] && pos < d[0])
                ++ pos;
            dp[i][j] = dp[pos][j] + dp[i][j + 1];
        }
        if (j == i)
            ++ dp[i][j];
    }
    }
}
void write()
{
    int s = 0;
    freopen("desc.out", "w", stdout);
    printf("%lld\n", dp[m][1]);
    int i = 1, j = 0, crt = 1, pos;
    while (n > 1)
    {
        while (n % d[crt] != 0LL)
            ++ crt;
        pos = bs(n / d[crt]);
        if (pos != 0 && dp[pos][crt] < k)
        {
            k -= dp[pos][crt];
            ++ crt;
        }
        else
        {
            printf("%d ", d[crt]);
            n /= d[crt];
        }
    }
}
int main()
{
    read();
    solve();
    write();
    return 0;
}