Pagini recente » Cod sursa (job #793727) | Cod sursa (job #1051206) | Cod sursa (job #271564) | Cod sursa (job #2347342) | Cod sursa (job #51145)
Cod sursa(job #51145)
#include <stdio.h>
#include <math.h>
#include <vector>
#include <algorithm>
#include <string.h>
#define NMAX 4020
using namespace std;
int A[NMAX][NMAX], Sol[NMAX];
long long N;
int K, M;
vector<long long> D;
int cb(long long x)
{
int lo, hi, mid;
for (lo = 0, hi = M, mid = (lo+hi)/2; lo <= hi; mid = (lo+hi)/2)
{
if (x == D[mid]) return mid;
if (x < D[mid]) hi = mid-1;
else lo = mid+1;
}
return -1;
}
int main()
{
int i, j, rad, p, nsol = 0, t;
long long ii;
freopen("desc.in", "r", stdin);
scanf("%lld %d", &N, &K);
D.clear();
memset(A, 0, sizeof(A));
D.push_back(1);
for (ii = 2; ii*ii <= N; ii++)
if (N%ii == 0) {D.push_back(ii);
if (N/ii != ii) D.push_back(N/ii); }
D.push_back(N);
sort(D.begin(), D.end());
M = D.size();
for (i = 0; i < M; i++) A[0][i] = 1;
for (i = 1; i < M; i++)
{
for (j = i; j > 0; j--)
{
A[i][j] = A[i][j+1];
p = -1;
if (D[i]%D[j] == 0)
p = cb(D[i]/D[j]);
if (p >= 0) A[i][j] += A[p][j];
}
}
freopen("desc.out", "w", stdout);
printf("%d\n", A[M-1][1]);
p = M-1;
for (i = 1; i < M; i++)
if (N%D[i] == 0)
{
p = cb(N/D[i]);
if (p == -1) break;
if (A[p][i] >= K) { Sol[nsol++] = D[i]; N /= D[i]; i--; }
else K-=A[p][i];
}
for (i = 0; i < nsol; i++) printf("%d ", Sol[i]);
printf("\n");
return 0;
}