Pagini recente » Cod sursa (job #1838436) | Cod sursa (job #1448044) | Cod sursa (job #2504580) | Cod sursa (job #2130867) | Cod sursa (job #1522271)
#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];
void read()
{
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 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;
}
void solve()
{
int i, 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];
}
}
}
void write()
{
int s = 0;
freopen("desc.out", "w", stdout);
printf("%lld\n", dp[m][1]);
int i = 1, j = 0, crt = 1, pos;
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];
}
}
}
int main()
{
read();
solve();
write();
return 0;
}