Cod sursa(job #1651570)

Utilizator hrazvanHarsan Razvan hrazvan Data 13 martie 2016 15:53:40
Problema Descompuneri Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.82 kb
#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;
  long long piv = diz[(st + dr) / 2], aux;
  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; 1LL * 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;
}