Cod sursa(job #2098918)

Utilizator hrazvanHarsan Razvan hrazvan Data 3 ianuarie 2018 17:58:06
Problema NumMst Scor 72
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <cstdio>
#include <cmath>
#define MAXP 3500
#define INF 2000000
char p[MAXP + 1];
int v[MAXP + 1], dv;
double d[2][MAXP + 1];
int pr[MAXP + 1][MAXP + 1];
char b[MAXP + 1][MAXP + 1];

inline void calcp(int n){
  int i, j;
  dv = 0;
  v[++dv] = 1;
  for(i = 2; i * i <= n; i++){
    if(!p[i]){
      v[++dv] = i;
      for(j = i * i; j <= n; j += i)
        p[j] = 1;
    }
  }
  for(; i <= n; i++)
    if(!p[i])
      v[++dv] = i;
}

int main(){
  FILE *in = fopen("nummst.in", "r");
  int n, c;
  fscanf(in, "%d", &n);
  fclose(in);
  c = 2;
  while(n % c != 0)
    c++;
  c = n / c;
  n = n / c;
  calcp(n);
  int i, j, lin, k;
  int x;
  for(i = 1; i <= n; i++)
    d[0][i] = -INF;
  for(i = 1; i <= dv; i++){
    lin = (i & 1);
    for(j = 0; j <= n; j++){
      d[lin][j] = d[!lin][j];
      pr[i][j] = pr[i - 1][j];
      b[i][j] = 0;
      x = v[i];
      k = 1;
      while(j >= x){
        if(d[lin][j] < d[!lin][j - x] + k * log(v[i])){
          d[lin][j] = d[!lin][j - x] + k * log(v[i]);
          pr[i][j] = x;
          b[i][j] = 1;
        }
        if(v[i] == 1)
          x = INF;
        x *= v[i];
        k++;
      }
    }
  }
  FILE *out = fopen("nummst.out", "w");
  if(pr[dv][n] == n){
    fprintf(out, "%d ", c);
    n--;
  }
  while(dv > 0 && n > 0){
    if(b[dv][n]){
      fprintf(out, "%d ", c * pr[dv][n]);
      n -= pr[dv][n];
    }
    dv--;
  }
  while(n > 0){
    fprintf(out, "%d ", c);
    n--;
  }
  fclose(out);
  return 0;
}