Cod sursa(job #586558)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 2 mai 2011 13:07:16
Problema NumMst Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>

using namespace std;

const int N = 1005;

double prod[N][3300];

int nrp, n, cmmdc, nb, pr[N], pred[N][3300];

bool d[N][3300];

void ciur() {
  bool f[n + 2];

  for (int i = 1; i <= n; ++ i)
    f[i] = 0;

  pr[0] = 1;

  for (int i = 2; i <= n; ++ i)
    if (! f[i]) {
      pr[++ nrp] = i;
      for (int j = i * i; j <= n; j += i)
        f[j] = 1;
    }
}

void solve() {
  for (int j = 0 ; j <= n; ++ j) {
    prod[0][j] = 0;
    pred[0][j] = j - 1;
    d[0][j] = 1;
  }
  for (int i = 1; i <= nrp; ++ i) {
    int newv = pr[i];

    d[i][0] = 1;

    while (newv < n) {
      for (int j = 0; j <= n - newv; ++ j)
        if (d[i - 1][j] && prod[i - 1][j] + (double)log((double)newv) > prod[i][j + newv]) {
          prod[i][j + newv] = prod[i - 1][j] + (double)log((double)newv);
          pred[i][j + newv] = j;
          d[i][j + newv] = 1;
        }
      newv *= pr[i];
    }

    for (int j = 0; j <= n; ++ j)
      if (prod[i - 1][j] > prod[i][j] || (! d[i][j])) {
        prod[i][j] = prod[i - 1][j];
        pred[i][j] = j;
        d[i][j] = 1;
      }
  }
}

vector <int> v;

void cycles(int n, int last) {
  if (n == 0)
    return;
  double M = - 1;
  int pozM = 0;

  for (int i = 0; i < last; ++ i)
    if (prod[i][n] > M && d[i][n]) {
      M = prod[i][n];
      pozM = i;
    }

  if (pred[pozM][n] != n)
    printf("%d ", (n - pred[pozM][n]) * cmmdc);
  cycles(pred[pozM][n], pozM);
}


int main() {
  freopen("nummst.in", "r", stdin);
  freopen("nummst.out", "w", stdout);

  scanf("%d", &nb);
  for (int i = 2; i <= nb; ++ i)
    if (nb % i == 0) {
        n = i;
        cmmdc = nb / i;
        break;
    }

  ciur();
  solve();
  cycles(n, nrp + 1);

  return 0;
}