Pagini recente » Cod sursa (job #1605829) | Cod sursa (job #1840924) | Cod sursa (job #564071) | Cod sursa (job #2309992) | Cod sursa (job #1952816)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxD 5002
using namespace std;
int m, k;
long long dp[maxD][maxD];
long long n, d[maxD];
int bs(long long x)
{
int i = 0, p = 1 << 12;
while (p)
{
if (i + p <= d[0] && d[i + p] <= x)
i += p;
p /= 2;
}
return i;
}
int main()
{
long long i;
freopen("desc.in", "r", stdin);
scanf("%lld %d", &n, &k);
for (i = 1LL; (long long)(i * i * 1LL) <= n; ++ i)
if (n % i == 0)
{
if (i != 1)
d[++ d[0]] = i;
if (n / i != i)
d[++ d[0]] = n / i;
}
sort(d + 1, d + d[0] + 1);
int j;
for (i = 1; i <= (m = d[0]); ++ i)
{
int pos = 1;
for (j = i; j >= 1; -- j)
{
if (d[i] % d[j])
dp[i][j] = dp[i][j + 1];
else
{
while (d[i] / d[j] > d[pos] && pos < d[0])
++ pos;
dp[i][j] = dp[pos][j] + dp[i][j + 1];
}
if (j == i)
++ dp[i][j];
}
}
int s = 0;
freopen("desc.out", "w", stdout);
printf("%lld\n", dp[m][1]);
int crt = 1, pos;
i=1;
while (n > 1)
{
while (n % d[crt] != 0LL)
++ crt;
pos = bs(n / d[crt]);
if (pos != 0 && dp[pos][crt] < k)
{
k -= dp[pos][crt];
++ crt;
}
else
{
printf("%d ", d[crt]);
n /= d[crt];
}
}
return 0;
}