Cod sursa(job #586563)

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

using namespace std;

const int N = 505;

double M, prod[2][3300];

int nrp, n, cmmdc, nb, pozM, pr[N];

short int pred1[N][3300], pred2[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] = 1;
    pred1[0][j] = 0;
    pred2[0][j] = j - 1;
  }
  for (int i = 1; i <= nrp; ++ i) {
    int newv = pr[i];

    for (int j = 0; j <= n; ++ j)
        prod[i & 1][j] = 0;

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

    for (int j = 0; j <= n; ++ j)
      if (prod[(i - 1) & 1][j] > prod[i & 1][j]) {
        prod[i & 1][j] = prod[(i - 1) & 1][j];
        pred1[i][j] = i - 1;
        pred2[i][j] = j;
      }

    if (prod[i & 1][n] > M) {
        M = prod[i & 1][n];
        pozM = i;
    }
  }
}

vector <int> v;

void cycles(int n, int pr) {
  if (n == 0)
    return;
  if (pred2[pr][n] != n)
    printf("%d ", (n - pred2[pr][n]) * cmmdc);
  cycles(pred2[pr][n], pred1[pr][n]);
}


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, pozM);

  return 0;
}