Cod sursa(job #2098907)

Utilizator hrazvanHarsan Razvan hrazvan Data 3 ianuarie 2018 17:36:59
Problema NumMst Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <cstdio>
#include <cmath>
#define MAXP 3500
#define INF 2000000000
char p[MAXP + 1];
int v[MAXP + 1], dv;
double d[2][MAXP + 1];
int pr[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;
  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];
      if(j >= v[i]){
        if(d[lin][j] < d[lin][j - v[i]] + log(v[i])){
          d[lin][j] = d[lin][j - v[i]] + log(v[i]);
          pr[i][j] = i;
        }
      }
    }
  }
  FILE *out = fopen("nummst.out", "w");
  long long x;
  char g;
  if(v[pr[dv][n]] == n){
    fprintf(out, "%d ", c);
    n--;
  }
  while(dv >= 0 && n > 0){
    x = 1;
    g = 0;
    while(pr[dv][n] == dv){
      x *= v[dv];
      n -= v[dv];
      g = 1;
    }
    if(g)
      fprintf(out, "%lld ", x * c);
    dv--;
  }
  fclose(out);
  return 0;
}