Pagini recente » Cod sursa (job #2395681) | Cod sursa (job #2756310) | Cod sursa (job #2718644) | Cod sursa (job #995377) | Cod sursa (job #1397182)
#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()
{
int 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;
}
int binsrc(int l, int r, long long val)
{
int index;
while (l <= r) {
int 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 (int i=1; i <= nd; i++) {
d[i][i] = 1;
for (int j=i-1; j >= 1; j--) {
if (divis[i] % divis[j] == 0) {
int 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";
int 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;
}