Cod sursa(job #2589031)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 25 martie 2020 18:06:45
Problema Descompuneri Scor 100
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 dp[NMAX][NMAX];
ll vec[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)
            vec[++nr] = d, vec[++nr] = n / d;
    if(sqrt(n) * sqrt(n) == n)
        vec[++nr] = sqrt(n);

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

    for(int i = 1; i <= nr; ++i)
    {
        pz[vec[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(vec[i] % vec[j] == 0)
                dp[i][j] += dp[pz[vec[i] / vec[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 % vec[i] == 0)
            {
                ll other = n / vec[i];
                if(dp[pz[other]][i] < k)
                    k -= dp[pz[other]][i];
                else {
                    fout << vec[i] << ' ';
                    n = other;
                    break;
                }
            }
    }
    return 0;
}