Pagini recente » Cod sursa (job #1757077) | Cod sursa (job #2271462) | Cod sursa (job #1543070) | Cod sursa (job #2750957) | Cod sursa (job #529724)
Cod sursa(job #529724)
#include <algorithm>
#include <stdio.h>
#include <vector>
#define ll long long
#define MAX 4096
#define pb push_back
#define mp make_pair
using namespace std;
ll n, k, rez;
vector <ll> vctDiv;
ll vctSol[MAX][MAX];
int main()
{
freopen("desc.in", "r", stdin);
freopen("desc.out", "w", stdout);
scanf("%lld %lld", &n, &k);
vctDiv.pb(n);
for (int i = 2; i * i <= n; i++)
if (n % i == 0)
{
vctDiv.pb(i);
if (i * i != n)
vctDiv.pb(n / i);
}
int m = vctDiv.size();
sort(vctDiv.begin(), vctDiv.end());
reverse(vctDiv.begin(), vctDiv.end());
for (int i = m - 1; i >= 0; i--)
{
int r = m - 1;
for (int j = 0; j < m; j++)
{
if (j)
vctSol[i][j] = vctSol[i][j - 1];
if (vctDiv[i] % vctDiv[j] == 0)
{
for (; vctDiv[r] < vctDiv[i] / vctDiv[j]; r--);
vctSol[i][j] += vctSol[r][j];
}
if (i == j)
vctSol[i][j]++;
}
}
printf("%lld\n", vctSol[0][m - 1]);
int l = 0;
for (int i = m - 1; n > 1 && i >= 0; )
if (vctSol[l][i] - vctSol[l][i - 1] >= k)
{
printf("%lld ", vctDiv[i]);
n /= vctDiv[i];
if (n > 1)
for (; vctDiv[l] > n; l++);
}
else k -= vctSol[l][i] - vctSol[l][i - 1], i--;
fclose(stdin);
fclose(stdout);
return 0;
}