Cod sursa(job #3149459)

Utilizator sheldonnChiper Alex sheldonn Data 8 septembrie 2023 18:28:57
Problema Descompuneri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <bits/stdc++.h>

using namespace std;

unordered_map<long long, int> mp;
const int nax = 4255;

long long dp[nax + 5][nax + 5];
void solve() {
    ifstream cin ("desc.in");
    ofstream cout ("desc.out");
    long long n, k;
    cin >> n >> k;
    vector<long long> divs;
    for (long long i = 1; i * i <= n; ++i) {
        if (n % i == 0) {
            divs.push_back(i);
            if (i * i != n) {
                divs.push_back(n / i);
            }
        }
    }
    sort(divs.begin(), divs.end());
    for (int i = 0; i < divs.size(); ++i) {
        mp[divs[i]] = i;
    }
    for (int i = 0; i < nax; ++i) {
        dp[0][i] = 1;
    }
    for (int i = 1; i < divs.size(); ++i) {
        for (int j = i; j > 0; --j) {
            if (divs[i] % divs[j] == 0) {
                long long comp = divs[i] / divs[j];
                dp[i][j] += dp[mp[comp]][j];
            }
            dp[i][j - 1] += dp[i][j];
        }
    }
    cout << dp[divs.size() - 1][0] << '\n';
    int it =0, from = 1;;
    while (n > 1) {
        int sum = 0, prev = 0;
        for (int j = from; j < nax; ++j) {
            int have = dp[mp[n]][j] - dp[mp[n]][j + 1];
            sum += have;
            if (sum >= k) {
                from = j;
                cout << divs[j] << ' ';
                k -= prev;
                n /= divs[j];
                break;
            }
            prev = sum;
        }
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    solve();
}