Pagini recente » Cod sursa (job #2310658) | Cod sursa (job #49434) | Cod sursa (job #2950081) | Cod sursa (job #702755) | Cod sursa (job #2774669)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <unordered_map>
using namespace std;
ifstream fin ("desc.in");
ofstream fout ("desc.out");
long long d[10001], dp[10001];
unordered_map <long long, int> u;
void pune_dp (int ind)
{
if (ind > d[0])
return;
int i;
long long lim = d[d[0]]/d[ind];
for (i = 1; lim >= d[i]; i++)
if (u.find (d[i] * d[ind]) != u.end())
dp[u[d[i]*d[ind]]] += dp[i];
}
void sterge_dp (int ind)
{
if (ind > d[0])
return;
int i;
long long lim = d[d[0]]/d[ind];
for (i = d[0]; i>=1; i--)
if (d[i] <= lim && u.find (d[i] * d[ind]) != u.end())
dp[u[d[i] * d[ind]]] -= dp[i];
}
void calc_dp ()
{
int i;
dp[1] = 1;
for (i = d[0]; i>=2; i--)
pune_dp (i);
}
int main()
{
long long n, k, nr;
int i, j;
fin >> n >> k;
for (i = 1; 1ll*i*i < n; i++)
if (n % i == 0)
{
d[++d[0]] = i;
d[++d[0]] = n/i;
}
if (1ll * i * i == n)
d[++d[0]] = i;
sort(d+1, d+d[0]+1);
for (i = 1; i<=d[0]; i++)
u[d[i]] = i;
calc_dp ();
fout << dp[d[0]] << '\n';
i = 2;
k--;
while (n > 1)
{
nr = dp[u[n]];
sterge_dp (i);
nr = nr - dp[u[n]];
if (k >= nr)
{
k = k - nr;
i++;
}
else
{
fout << d[i] << ' ';
pune_dp (i);
n = n / d[i];
}
}
return 0;
}