Pagini recente » Cod sursa (job #771323) | Cod sursa (job #814125) | Cod sursa (job #1496723) | Cod sursa (job #2750805) | Cod sursa (job #47097)
Cod sursa(job #47097)
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <map>
using namespace std;
int n, desc, a[4000][4000], diviz[1000], d[1000], p[1000], cnt = 0, nrdiv, x = 1, s[1000];
map <int, int> cheie;
void bkt(int k);
int main()
{
freopen("desc.in","r",stdin);
freopen("desc.out","w",stdout);
int i, temp, tn, j, crt, last, loop = 0, product = 1;
scanf("%d%d", &n, &desc);
temp = sqrt(n);
tn = n;
for(i = 2; i <= temp; ++i)
{
if(tn % i == 0)
d[++cnt] = i;
while(tn % i == 0)
{
++p[cnt];
tn /= i;
}
}
if(tn > 1)
{
d[++cnt] = tn;
p[cnt] = 1;
}
bkt(1);
sort(diviz + 1, diviz + nrdiv);
for(i = 0; i < nrdiv; ++i)
cheie[diviz[i]] = i;
for(i = 1; i < nrdiv; ++i)
{
a[0][i] = 1;
}
for(i = 1; i < nrdiv; ++i)
{
for(j = i; j > 0; --j)
{
a[i][j] = a[i][j + 1];
if(diviz[i] % diviz[j] == 0)
{
a[i][j] += a[cheie[diviz[i] / diviz[j]]][j];
}
}
}
printf("%d\n", a[cheie[n]][1]);
temp = a[cheie[n]][1];
crt = nrdiv - 1;
last = 1;
while(product < n)
{
for(i = last; i < nrdiv; ++i)
{
if(temp - a[crt][i + 1] >= desc)
break;
}
// printf("%d %d ", i, temp - a[cheie[crt]][i + 1]);
printf("%d ", diviz[i]);
product *= diviz[i];
desc -= temp - a[crt][i];
crt = cheie[diviz[crt] / diviz[i]];
temp = a[crt][i];
last = i;
//printf("%d %d %d", desc, crt, temp);
}
return 0;
}
void bkt(int k)
{
int i, oldx;
if(k == cnt + 1)
{
diviz[nrdiv] = x;
//printf("%d ", x);
nrdiv++;
}
else
{
bkt(k + 1);
oldx = x;
for(i = 1; i <= p[k]; ++i)
{
x *= d[k];
bkt(k + 1);
}
x = oldx;
}
}