Cod sursa(job #3149431)

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

// using namespace std;

// unordered_map<long long, int> mp;
// const int nax = 6725;

// long long dp[nax][nax];
// 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 < divs.size(); ++i) {

//     }
// }

// int main()
// {
//     ios_base::sync_with_stdio(false);
//     cin.tie(0);
//     cout.tie(0);
//     solve();
// }
#include<bits/stdc++.h>
using namespace std;
ifstream f("desc.in");
ofstream g("desc.out");
long long n, k;
int dp[4201][4201];
long long divi[7500], nr;
unordered_map<long long, int>d;
int main()
{
    f >> n >> k;
    for(long long i = 1; i * i <= n; ++i)
    {
        if(n % i == 0)
        {
            if(i != 1)
                divi[++nr] = i;
            if(i != n / i)
                divi[++nr] = n/i;
        }
    }
    sort(divi + 1, divi + nr + 1);
    divi[0] = 1;
    for(int i = 1; i <= nr; ++i)
        d[divi[i]] = i;
    dp[0][nr] = 1;
    for(int i = 0; i <= nr; ++i)
    {
        for(int e = nr; e >= 1; --e)
            dp[i][e] += dp[i][e+1];
        for(int j = i+1; j <= nr; ++j)
        {
            if(divi[j] % divi[i] != 0)
                continue;
            long long rap = divi[j]/divi[i];
            if(d.find(rap) == d.end())
                continue;
            int x = d[rap];
            dp[j][x] += dp[i][x];
        }
    }
    int L = nr;
    int C = 1;
    g << dp[nr][1] << '\n';
    while(k)
    {
        if(dp[L][C] - dp[L][C+1] < k)
        {
            k -= (dp[L][C] - dp[L][C+1]);
            ++C;
        }
        else
            if(L == C && k == 1)
            {
                g << divi[C] << " ";
                break;
            }
            else
            {
                g << divi[C] << " ";
                n /= divi[C];
                L = d[n];
            }
    }
    return 0;
}