Pagini recente » Cod sursa (job #1573380) | Cod sursa (job #2308807) | Cod sursa (job #103473) | Cod sursa (job #843900) | Cod sursa (job #1279595)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f ("desc.in");
ofstream g ("desc.out");
const int MAXIM = 3005;
int n, k, nrdiv;
int divizor[MAXIM];
int 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;
int lim = n / 2;
for (int d = 2; d <= lim; d++)
if (n % d == 0) {
divizor[++nrdiv] = d;
}
divizor[++nrdiv] = n;
for (int i = 1; i <= nrdiv; i++) posibilitati[0][i] = 1;
}
void rezolva() {
int poz = 0, lim;
for (int i = 1; i <= nrdiv; i++) {
int poz = 0;
for (int 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';
int poz, j = 1, lim;
for (int 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;
}
}
//cout << i << ' ';
}
}
int main() {
f >> n >> k;
initializeaza();
rezolva();
scrie();
return 0;
}