Cod sursa(job #1597173)

Utilizator ZenusTudor Costin Razvan Zenus Data 11 februarie 2016 19:11:42
Problema Descompuneri Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <bits/stdc++.h>

using namespace std;

int d[4009][4009];
long long n , divs[4009];
map < long long , int > w;
int k , L , i , j , c , fk , p , d0;

int main()
{
freopen("desc.in" , "r" , stdin);
freopen("desc.out" , "w" , stdout);

scanf("%lld" , &n);
scanf("%d" , &k);

for (i = 2 ; 1LL * i * i <= n ; ++i)
if (n % i == 0)
{
    L++;
    divs[L] = i;
    w[i] = L;
}

for (i = 2 ; 1LL * i * i < n ; ++i)
if (n % i == 0) ++L;

for (i = 2 ; 1LL * i * i < n ; ++i)
if (n % i == 0)
{
    w[n / i] = L;
    divs[L] = n / i;
    L--;
}

for (i = 2 ; 1LL * i * i < n ; ++i)
if (n % i == 0) ++L;

L++;
divs[L] = n;
w[n] = L;

for (j = L ; j ; --j)
{
    d[j][j] = 1;

    for (i = j + 1 ; i <= L ; ++i)
    {
        d[j][i] = d[j+1][i];
        if (divs[i] % divs[j] == 0)
        d[j][i] += d[j][w[divs[i] / divs[j]]];
    }
}

printf("%d\n" , d[1][L]);

p = 1;
while (n > 1)
{
    fk = k;
    for (i = p ; i <= L ; ++i)
    if (n % divs[i] == 0)
    {
        d0 = d[i][w[n / divs[i]]];
        if (d0 >= fk) break;
        else fk -= d0;
    }

    for (i = p ; i <= L ; ++i)
    if (n % divs[i] == 0)
    {
        d0 = d[i][w[n / divs[i]]];
        if (k == fk) break;
        k -= d0;
    }

    p = i;
    n /= divs[i];
    printf("%d " , divs[i]);
}
printf("\n");

return 0;
}