Cod sursa(job #2768339)

Utilizator PatrickCplusplusPatrick Kristian Ondreovici PatrickCplusplus Data 10 august 2021 12:02:27
Problema Descompuneri Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("desc.in");
ofstream fout("desc.out");

long long n, k;
vector <long long> d;
map <long long, int> fr;
map <int, long long> fr2;
long long dp[1005][1005];

long long solve(int i, int j){
    if (i > d.size()){
        if (j == d.size()){
            return dp[i][j] = 1;
        }
        return 0;
    }
    if (dp[i][j]){
        return dp[i][j];
    }
    long long val1 = fr2[i], val2 = fr2[j];
    long long val = 1LL * val1 * val2;
    if (fr[val]){
        return dp[i][j] = solve(i + 1, j) + solve(i, fr[val]);
    }
    else{
        return dp[i][j] = solve(i + 1, j);
    }
}

int main(){
    fin >> n >> k;
    for (int i = 1; 1LL * i * i <= n; ++i){
        if (n % i == 0){
            d.push_back(i);
            if (n / i != i){
                d.push_back(n / i);
            }
        }
    }
    sort(d.begin(), d.end());
    for (int i = 1; i <= (int)d.size(); ++i){
        fr[d[i - 1]] = i;
        fr2[i] = d[i - 1];
    }
    fout << solve(2, 1) << "\n";
    int i = 2, j = 1;
    while (i <= d.size()){
        long long val1 = fr2[i], val2 = fr2[j];
        long long val = 1LL * val1 * val2;
        if (fr[val]){
            if (dp[i][fr[val]] < k){
                k -= dp[i][fr[val]];
                ++i;
            }
            else{
                fout << fr2[i] << " ";
                j = fr[val];
            }
        }
        else{
            ++i;
        }
    }
    fin.close();
    fout.close();
    return 0;
}