Pagini recente » Cod sursa (job #2908389) | Cod sursa (job #269116) | Cod sursa (job #60865) | Cod sursa (job #3276635) | Cod sursa (job #2774572)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin ("desc.in");
ofstream fout ("desc.out");
long long d[10001], dp[10001];
int cb (long long val)
{
int st = 1, dr = d[0], mij;
while (st <= dr)
{
mij = (st+dr)>>1;
if (d[mij] == val)
return mij;
if (d[mij] < val)
st = mij + 1;
else
dr = mij - 1;
}
return -1;
}
void calc_dp (int is, long long n)
{
int i, j, poz;
for (i = 1; i<=d[0]; i++)
dp[i] = 0;
dp[1] = 1;
for (i = d[0]; i>=is; i--)
for (j = 1; j<=d[0] && n/d[j] >= d[i]; j++)
{
poz = cb (d[i] * d[j]);
if (poz != -1)
dp[poz] += dp[j];
}
}
void sterge_dp (int is)
{
int i, poz;
for (i = d[0]; i>=1; i--)
if (d[i] % d[is] == 0)
{
poz = cb (d[i] / d[is]);
dp[i] = dp[i] - dp[poz];
}
}
void pune_dp (int is)
{
int j, poz;
for (j = 1; j<=d[0] && d[0]/d[j] >= d[is]; j++)
{
poz = cb (d[is] * d[j]);
if (poz != -1)
dp[poz] += dp[j];
}
}
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);
calc_dp (2, n);
fout << dp[d[0]] << '\n';
k--;
i = 2;
while (n > 1)
{
nr = dp[cb(n)];
sterge_dp (i);
nr = nr - dp[cb(n)];
if (k >= nr)
{
i++;
k = k - nr;
}
else
{
fout << i << ' ';
pune_dp(i);
n = n / i;
}
}
return 0;
}