Pagini recente » Cod sursa (job #2999360) | Borderou de evaluare (job #985441) | Cod sursa (job #932237) | Cod sursa (job #3282428) | Cod sursa (job #2922342)
/// Preset de infoarena
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("desc.in");
ofstream fout("desc.out");
#define int long long
int n, p, dp[5005][5005], d[5005], nrdiv;
signed main()
{
fin >> n >> p;
int k;
for(k = 1; k * k <= n; k++)
{
if(n % k == 0)
{
d[++nrdiv] = k;
if(n / k != k)
d[++nrdiv] = n / k;
}
}
sort(d + 1, d + nrdiv + 1);
for(int i = 1; i <= nrdiv; i++)
dp[1][i] = 1;
for(int i = 2; i <= nrdiv; i++)
{
int poz = 1;
for(int j = i; j > 1; j--)
{
dp[i][j] = dp[i][j + 1];
if(d[i] % d[j] != 0)
continue;
int val = d[i] / d[j];
while(d[poz] < val)
poz++;
dp[i][j] += dp[poz][j];
}
dp[i][1] = dp[i][2];
}
fout << dp[nrdiv][1] << '\n';
int i = nrdiv, j = 1;
while(n > 1)
{
while(dp[i][j] - dp[i][j + 1] < p)
{
p -= (dp[i][j] - dp[i][j + 1]);
j++;
}
fout << d[j]<< ' ';
while(i >= 2 && d[i] > n / d[j])
i--;
n = d[i];
}
return 0;
}