Pagini recente » Cod sursa (job #82623) | Borderou de evaluare (job #3182043) | Cod sursa (job #51403) | Borderou de evaluare (job #2002011) | Cod sursa (job #1399000)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("desc.in");
ofstream fout("desc.out");
long long N, K, M;
long long dvz[5002];
int dp[5002][5002]; //dp[i][j] - nr de posibilitati de a forma divizorul i folosind divizorii j, j + 1... D
void get_div()
{
for (long long d = 2; d * d <= N; ++d)
{
if (N % d == 0LL)
{
dvz[++M] = d;
if (d * d < N)
dvz[++M] = N / d;
}
}
dvz[++M] = N;
sort(dvz + 1, dvz + M + 1);
}
int cb(long long x)
{
int lt = 0, rt = M + 1;
while (rt - lt > 1)
{
int mid = (lt + rt) / 2;
if (dvz[mid] <= x)
lt = mid;
else
rt = mid;
}
return lt;
}
int main()
{
fin >> N >> K;
get_div();
for (int i = 1; i <= M; ++i)
{
dp[i][i] = 1;
for (int j = i - 1; j >= 1; --j)
{
dp[i][j] = dp[i][j + 1];
if (dvz[i] % dvz[j] == 0LL)
{
int pos = cb(dvz[i] / dvz[j]);
dp[i][j] += dp[pos][j];
}
}
}
fout << dp[M][1] << '\n';
int now = 1, pos;
int a[100], nr = 0;
while (N > 1)
{
while (N % dvz[now] != 0LL)
++now;
pos = cb(N / dvz[now]);
if (pos != 0 && dp[pos][now] < K)
{
K -= dp[pos][now];
++now;
continue;
}
fout << dvz[now] << ' ';
N /= dvz[now];
}
fin.close();
fout.close();
return 0;
}