Cod sursa(job #2098665)

Utilizator giotoPopescu Ioan gioto Data 3 ianuarie 2018 13:11:08
Problema Descompuneri Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

long long n, k;
long long a[5002];
long long d[5002][5002];
int NR;
const int MOD = 100007;
int main()
{
    freopen("desc.in", "r", stdin);
    freopen("desc.out", "w", stdout);
    scanf("%lld%lld", &n, &k);
    a[++NR] = n;
    for(int i = 2; 1LL * i * i <= n ; ++i){
        if(n % i == 0){
            if(i != n / i) a[++NR] = n / i;
            a[++NR] = i;
        }
    }
    sort(a + 1, a + NR + 1);
    for(int j = 1; j <= n ; ++j)
        d[0][j] = 1;
    for(int i = 1; i <= NR ; ++i){
        int l = 1;
        for(int j = NR; j >= 1 ; --j){
            d[i][j] = d[i][j + 1];
            if(a[i] % a[j] == 0){
                while(a[l] < a[i] / a[j]) ++l;
                if(a[l] > a[i] / a[j]) --l;
                d[i][j] += d[l][j];
            }
        }
    }
    printf("%d\n", d[NR][1]);
    int i = NR, j = 1;
    while(n > 1 && i > 0){
        while(k > d[i][j] - d[i][j + 1]) k = k - d[i][j] + d[i][j + 1], ++j;
        printf("%lld ", a[j]);
        while(i > 0 && a[i] > n / a[j]) --i;
        n = a[i];
    }
    return 0;
}