Cod sursa(job #2922342)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 7 septembrie 2022 23:06:21
Problema Descompuneri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.27 kb
/// Preset de infoarena
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

ifstream fin("desc.in");
ofstream fout("desc.out");
#define int long long

int n, p, dp[5005][5005], d[5005], nrdiv;

signed main()
{
    fin >> n >> p;
    int k;
    for(k = 1; k * k <= n; k++)
    {
        if(n % k == 0)
        {
            d[++nrdiv] = k;
            if(n / k != k)
                d[++nrdiv] = n / k;
        }
    }
    sort(d + 1, d + nrdiv + 1);
    for(int i = 1; i <= nrdiv; i++)
        dp[1][i] = 1;
    for(int i = 2; i <= nrdiv; i++)
    {
        int poz = 1;
        for(int j = i; j > 1; j--)
        {
            dp[i][j] = dp[i][j + 1];
            if(d[i] % d[j] != 0)
                continue;
            int val = d[i] / d[j];
            while(d[poz] < val)
                poz++;
            dp[i][j] += dp[poz][j];
        }
        dp[i][1] = dp[i][2];
    }
    fout << dp[nrdiv][1] << '\n';
    int i = nrdiv, j = 1;
    while(n > 1)
    {
        while(dp[i][j] - dp[i][j + 1] < p)
        {
            p -= (dp[i][j] - dp[i][j + 1]);
            j++;
        }
        fout << d[j]<< ' ';
        while(i >= 2 && d[i] > n / d[j])
            i--;
        n = d[i];
    }
    return 0;
}