Cod sursa(job #2628956)

Utilizator CraniXortDumitrescul Eduard CraniXort Data 18 iunie 2020 12:57:58
Problema Descompuneri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <bits/stdc++.h>

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

std::vector <long long> d;

long long binarySearch (long long *arr, long long left, long long right, long long val){
    long long mid, sol;
    while (left <= right){
        mid = (left + right) / 2;
        if (arr[mid] >= val){
            sol = mid;
            left = mid + 1;
        }
        else
            right = mid - 1;
    }
    return sol;
}

int main()
{
    long long n, k, i, j, divisor;
    fin >> n >> k;
    for (i=1; i*i<=n; i++){
        if (n % i == 0){
            d.push_back (i);
            if (n / i != i)
            d.push_back (n/i);
        }
    }
    std::sort (d.begin(), d.end());
    /*
    for (i=0; i<d.size(); i++)
        fout << d[i] << ' ';
        */

    long long dp[d.size()+2][d.size()+2];
    long long last;
    memset (dp, 0, sizeof dp);

    for (i=0; i<d.size(); i++)
        dp[0][i] = 1;
    for (i=1; i<d.size(); i++){

        last = 0;
        for (j=d.size()-1; j>=0; j--){
            divisor = d[i];
            dp[i][j] = dp[i][j+1];
            if (divisor % d[j] == 0){
                divisor /= d[j];
                while (d[last] < divisor)
                    last ++;
                dp[i][j] += dp[last][j];
            }
        }
    }
    /*
    for (i=0; i<d.size(); i++, fout << '\n'){
        fout << d[i] << " - ";
        for (j=0; j<d.size(); j++)
        fout << dp[i][j] << ' ';
    }
    */



    fout << dp[d.size()-1][1] << '\n';

    std::map <long long, long long> mp;
    for (i=0; i<d.size(); i++)
        mp[d[i]] = i;

    i = 1;
    long long crt = n;
    while (crt > 1){
        divisor = d[i];
        if (crt%divisor == 0 and dp[mp[crt/divisor]][i] >= k){
            fout << divisor << ' ';
            crt /= divisor;
        }
        else if (crt%divisor == 0){
            k -= dp[mp[crt/divisor]][i];
            i ++;
        }
        else i++;
    }



    return 0;
}