Cod sursa(job #3327449)

Utilizator Radu_BicliBiclineru Radu Radu_Bicli Data 3 decembrie 2025 22:15:08
Problema Descompuneri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;

#define STDIO 0
#if STDIO
    #define fin cin
    #define fout cout
#else
    ifstream fin("desc.in");
    ofstream fout("desc.out");
#endif // STDIO

typedef long long ll;
ll divi[5002], nrd, d[5002][5002];
ll n, k, i, j;

int main() {
    if(STDIO) ios_base::sync_with_stdio(false);
    fin.tie(nullptr);
    fout.tie(nullptr);

    fin >> n >> k;
    for(ll d = 1; d * d <= n; d++) {
        if(n % d == 0) {
            divi[++nrd] = d;
            if(d * d != n) divi[++nrd] = n / d;
        }
    }
    sort(divi + 1, divi + nrd + 1);

    for(i = 1; i <= nrd; i++) d[1][i] = 1;
    for(i = 2; i <= nrd; i++) {
        int opd = 1;
        for(j = i; j > 1; j--) {
            d[i][j] = d[i][j + 1];
            if(divi[i] % divi[j] == 0) {
                while(opd <= i && divi[opd] != divi[i] / divi[j]) {
                    opd++;
                }
                if(opd <= i) d[i][j] += d[opd][j];
            }
        }
    }
    fout << d[nrd][2] << "\n";

    ll nCur = nrd;
    ll dCur = 2;
    while(nCur > 1) {
        ll ant = 0;

        while(divi[nCur] > n) nCur--;

        ll modTot = 0;
        for(j = dCur; j < nrd; j++) {
            modTot += d[nCur][j] - d[nCur][j + 1];

            if(modTot >= k) {
                dCur = j;
                fout << divi[j] << " ";
                n /= divi[j];
                k -= ant;
                break;
            }
            ant = modTot;
        }
    }

    return 0;
}