Pagini recente » Cod sursa (job #419527) | Cod sursa (job #2205871) | Cod sursa (job #1605093) | Cod sursa (job #167965) | Cod sursa (job #1279600)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f ("desc.in");
ofstream g ("desc.out");
const long long MAXIM = 3005;
long long n, k, nrdiv;
int divizor[MAXIM];
long long posibilitati[MAXIM][MAXIM]; //p[i][j] = numarul de posibilitati pentru a obtine divizorul i folosind divizorii j + 1, j + 2 etc
void initializeaza() {
divizor[0] = 1;
long long d = 2;
for (d = 2; d * d < n; d++)
if (n % d == 0) {
divizor[++nrdiv] = d;
divizor[++nrdiv] = n / d;
}
if (d * d == n) divizor[++nrdiv] = d;
divizor[++nrdiv] = n;
sort(divizor + 1, divizor + nrdiv + 1);
for (long long i = 1; i <= nrdiv; i++) posibilitati[0][i] = 1;
}
void rezolva() {
long long poz = 0, lim;
for (long long i = 1; i <= nrdiv; i++) {
poz = 0;
for (long long j = nrdiv; j >= 1; j--) { //iau divizorii in ordine descrescatoare
posibilitati[i][j] = posibilitati[i][j + 1];
if (divizor[i] % divizor[j] == 0) {
lim = divizor[i] / divizor[j];
for (; divizor[poz] < lim; poz++);
posibilitati[i][j] += posibilitati[poz][j];
}
}
}
}
void scrie() {
g << posibilitati[nrdiv][1] << '\n';
long long poz, j = 1, lim;
for (long long i = nrdiv; i >= 1; ) {
poz = nrdiv;
for (; j <= nrdiv; j++)
if (divizor[i] % divizor[j] == 0) {
lim = divizor[i] / divizor[j];
for (; divizor[poz] > lim; poz--);
if (posibilitati[poz][j] < k) k-= posibilitati[poz][j];
else {
g << divizor[j] << ' ';
i = poz;
break;
}
}
}
}
int main() {
f >> n >> k;
initializeaza();
rezolva();
scrie();
return 0;
}