Cod sursa(job #2589025)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 25 martie 2020 17:51:17
Problema Descompuneri Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <bits/stdc++.h>

#define NMAX 10005
using namespace std;

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

typedef long long ll;
int nrD[NMAX], dp[NMAX][NMAX];
unordered_map<ll, int> pz;

int main()
{
    ll n, k;
    fin >> n >> k;

    int nr = 0;
    for(ll d = 1; d * d < n; ++d)
        if(n % d == 0)
            nrD[++nr] = d, nrD[++nr] = n / d;
    if(sqrt(n) * sqrt(n) == n)
        nrD[++nr] = sqrt(n);

    sort(nrD + 1, nrD + nr + 1);

    for(int i = 1; i <= nr; ++i)
    {
        pz[nrD[i]] = i;
        dp[1][i] = 1;
    }

    for(int i = 2; i <= nr; ++i)
    {
        for(int j = i; j >= 2; --j)
        {
            dp[i][j] = dp[i][j + 1];
            if(nrD[i] % nrD[j] == 0)
                dp[i][j] += dp[pz[nrD[i] / nrD[j]]][j];
        }
        dp[i][1] = dp[i][2];
    }

    fout << dp[nr][1] << '\n';

    int i = 2;
    while(n > 1)
    {
        for(; i <= nr; ++i)
            if(n % nrD[i] == 0)
            {
                ll other = n / nrD[i];
                if(dp[pz[other]][i] < k)
                    k -= dp[pz[other]][i];
                else {
                    fout << nrD[i] << ' ';
                    n = other;
                    break;
                }
            }
    }
    return 0;
}