Pagini recente » Cod sursa (job #1802551) | Cod sursa (job #3201862) | Cod sursa (job #306459) | Cod sursa (job #2324621) | Cod sursa (job #732601)
Cod sursa(job #732601)
#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()
{
double val=N;
int dist=int (sqrt(val) )+1;
for (int i=1;i<=dist;++i)
if ( N%i==0 )
F[++NF]=i;
if ( F[NF]!=N/F[NF] )
F[++NF]=N/F[NF-1];
for (int i=NF-1;i>0;--i)
F[++NF]=N/F[i];
}
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()
{
FILE *fout = fopen("desc.out", "wt");
fprintf(fout, "%d\n", DP[NF - 1][1]);
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
{
fprintf(fout, "%lld ", F[i]);
N /= F[i];
}
}
fprintf(fout, "\n");
fclose(fout);
}
int main()
{
read();
factori();
dinamica();
write();
return 0;
}