Cod sursa(job #1399000)

Utilizator Ionut228Ionut Calofir Ionut228 Data 24 martie 2015 15:03:46
Problema Descompuneri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin("desc.in");
ofstream fout("desc.out");

long long N, K, M;
long long dvz[5002];
int dp[5002][5002]; //dp[i][j] - nr de posibilitati de a forma divizorul i folosind divizorii j, j + 1... D

void get_div()
{
    for (long long d = 2; d * d <= N; ++d)
    {
        if (N % d == 0LL)
        {
            dvz[++M] = d;
            if (d * d < N)
                dvz[++M] = N / d;
        }
    }
    dvz[++M] = N;
    sort(dvz + 1, dvz + M + 1);
}

int cb(long long x)
{
    int lt = 0, rt = M + 1;
    while (rt - lt > 1)
    {
        int mid = (lt + rt) / 2;

        if (dvz[mid] <= x)
            lt = mid;
        else
            rt = mid;
    }

    return lt;
}

int main()
{
    fin >> N >> K;
    get_div();

    for (int i = 1; i <= M; ++i)
    {
        dp[i][i] = 1;
        for (int j = i - 1; j >= 1; --j)
        {
            dp[i][j] = dp[i][j + 1];
            if (dvz[i] % dvz[j] == 0LL)
            {
                int pos = cb(dvz[i] / dvz[j]);
                dp[i][j] += dp[pos][j];
            }
        }
    }

    fout << dp[M][1] << '\n';
    int now = 1, pos;
    int a[100], nr = 0;
    while (N > 1)
    {
        while (N % dvz[now] != 0LL)
            ++now;

        pos = cb(N / dvz[now]);
        if (pos != 0 && dp[pos][now] < K)
        {
            K -= dp[pos][now];
            ++now;
            continue;
        }

        fout << dvz[now] << ' ';
        N /= dvz[now];
    }

    fin.close();
    fout.close();
    return 0;
}