Pagini recente » Cod sursa (job #1364686) | Cod sursa (job #1250536) | Cod sursa (job #350910) | Cod sursa (job #1545759) | Cod sursa (job #1651553)
#include <stdio.h>
#define MAXP 12
#define MAXD 7000
int ptr[MAXP], dr, div;
long long diz[MAXD], fact[MAXP];
int d[MAXD][MAXD];
inline int min2(int a, int b){
return a < b ? a : b;
}
void bkt(int p, long long x){
if(p == dr){
diz[div] = x;
div++;
}
else{
int i;
for(i = 0; i <= ptr[p]; i++){
bkt(p + 1, x);
x *= fact[p];
}
}
}
void qs(int st, int dr){
int i = st, j = dr, aux;
long long piv = diz[(st + dr) / 2];
while(i <= j){
while(diz[i] < piv)
i++;
while(diz[j] > piv)
j--;
if(i <= j){
aux = diz[i]; diz[i] = diz[j]; diz[j] = aux;
i++; j--;
}
}
if(st < j)
qs(st, j);
if(i < dr)
qs(i, dr);
}
int main(){
FILE *in = fopen("desc.in", "r");
long long n, cn;
int k, i, j, ii;
fscanf(in, "%lld%d", &n, &k);
cn = n;
fclose(in);
for(i = 2; i * i <= cn; i++){
if(cn % i == 0){
fact[dr] = i;
while(cn % i == 0){
cn /= i;
ptr[dr]++;
}
dr++;
}
}
if(cn > 1){
fact[dr] = cn;
ptr[dr] = 1;
dr++;
}
bkt(0, 1);
qs(0, div - 1);
for(i = 0; i < div; i++)
d[0][i] = 1;
for(i = 1; i < div; i++){
ii = 0;
for(j = i; j > 0; j--){
if(j != i)
d[i][j] = d[i][j + 1];
if(diz[i] % diz[j] == 0){
while(diz[ii] < diz[i] / diz[j])
ii++;
d[i][j] += d[ii][j];
}
}
}
FILE *out = fopen("desc.out", "w");
fprintf(out, "%d\n", d[div - 1][1]);
i = div - 1;
j = 1;
while(i > 0){
while(j < i && k > d[i][j] - d[i][j + 1]){
k -= d[i][j] - d[i][j + 1];
j++;
}
fprintf(out, "%lld ", diz[j]);
ii = i;
while(diz[ii] > diz[i] / diz[j])
ii--;
i = ii;
}
fclose(out);
return 0;
}