Cod sursa(job #2588995)

Utilizator MocalinnoMoca Andrei Catalin Mocalinno Data 25 martie 2020 17:13:03
Problema Descompuneri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <bits/stdc++.h>
#define PLEC fin.close(); fout.close(); return 0;
using namespace std;
ifstream fin("desc.in");
ofstream fout("desc.out");
const int N(10001);
unordered_map<int64_t, int> M;
int dp[N][N], k, nrd, pos;
int64_t n, v[N], dv;
int main()
{
    fin >> n >> k;
    for (dv = 1; dv * dv < n; ++dv)
        if (n % dv == 0)
            v[++nrd] = dv, v[++nrd] = n / dv;
    if (dv * dv == n)
        v[++nrd] = dv;
    sort(v + 1, v + nrd + 1);
    for (int i = 1; i <= nrd; ++i)
        M[v[i]] = i, dp[1][i] = 1;
    for (int i = 2; i <= nrd; ++i) {
        for (int j = i; j > 1; --j) {
            dp[i][j] = dp[i][j+1];
            if (v[i] % v[j] == 0)
                dp[i][j] += dp[M[v[i] / v[j]]][j];
        }
        dp[i][1] = dp[i][2];
    }
    fout << dp[nrd][1] << '\n';
    int i(2);
    while (n > 1)
        for (; i <= nrd; ++i)
            if (n % v[i] == 0) {
                dv = n / v[i];
                pos = M[dv];
                if (dp[pos][i] < k)
                    k -= dp[pos][i];
                else {
                    fout << v[i] << ' ';
                    n = dv;
                    break;
                }
            }
    PLEC
}