Pagini recente » Cod sursa (job #2029207) | Cod sursa (job #3160445) | Cod sursa (job #2839306) | Cod sursa (job #1981438) | Cod sursa (job #732614)
Cod sursa(job #732614)
#include <fstream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int NMAX = 4000;
long long N;
int K, NF;
long long F[NMAX];
int DP[NMAX][NMAX];
void read()
{
FILE *fin = fopen("desc.in", "rt");
fscanf(fin, " %lld %d", &N, &K);
fclose(fin);
}
void factori()
{
int i, stop;
stop = (int) sqrt((double) N);
F[NF++] = 1;
if (N > 1) F[NF++] = N;
for (i = 2; i < stop; ++i)
if (N % i == 0)
{
F[NF++] = i;
F[NF++] = N / i;
}
if (stop > 1 && N % stop == 0)
{
F[NF++] = stop;
if (N / stop != stop)
F[NF++] = N / stop;
}
sort(F, F + NF);
}
void dinamica()
{
int i, j, k;
long long stop;
for (i = 0; i < NF; ++i)
DP[0][i] = 1;
for (i = 1; i < NF; ++i)
{
k = 0;
for (j = NF - 1; j; --j)
{
DP[i][j] = DP[i][j + 1];
if (F[i] % F[j] == 0)
{
for (stop = F[i] / F[j]; F[k] < stop; ++k);
DP[i][j] += DP[k][j];
}
}
}
}
void write()
{
ofstream G("desc.out");
G<<DP[NF - 1][1]<<'\n';
int i, j;
long long d;
i = 1; j = NF - 1;
while (N > 1)
{
while (N % F[i]) ++i;
d = N / F[i];
while (F[j] > d) --j;
if (DP[j][i] < K)
K -= DP[j][i++];
else
{
G<<F[i]<<' ';
N /= F[i];
}
}
G<<'\n';
G.close();
}
int main()
{
read();
factori();
dinamica();
write();
return 0;
}