Pagini recente » Cod sursa (job #2084602) | Cod sursa (job #756497) | Cod sursa (job #2658896) | Cod sursa (job #540620) | Cod sursa (job #1397187)
#include <fstream>
#include <algorithm>
#define NMax 4001
using namespace std;
ifstream f("desc.in");
ofstream g("desc.out");
long long n, k, divis[NMax], d[NMax][NMax], nd, l;
void findDiv()
{
long long i;
for (i=2; i * i < n; i++) {
if (n % i == 0) {
divis[++nd] = i;
divis[++nd] = n / i;
}
}
if (i * i == n)
divis[++nd] = i;
divis[++nd] = n;
}
long long binsrc(long long l, long long r, long long val)
{
long long index;
while (l <= r) {
long long mid = (l+r)>>1;
if (divis[mid] == val) {
index = mid;
break;
}
else if (divis[mid] > val)
r = mid - 1;
else
l = mid + 1;
}
return index;
}
int main()
{
f>>n>>k;
findDiv();
sort(divis + 1, divis + nd + 1);
for (long long i=1; i <= nd; i++) {
d[i][i] = 1;
for (long long j=i-1; j >= 1; j--) {
if (divis[i] % divis[j] == 0) {
long long val = divis[i] / divis[j], ind = binsrc(1, nd, val);
d[i][j] = d[i][j+1] + d[ind][j];
}
else
d[i][j] = d[i][j+1];
}
}
g<<d[nd][1]<<"\n";
long long line = nd, col=1;
while (n != 1) {
while (d[line][col] - d[line][col+1] < k) {
k -= (d[line][col] - d[line][col+1]);
col++;
}
g << divis[col] <<" ";
line = binsrc(1, nd, n / divis[col]);
n /= divis[col];
}
return 0;
}