Cod sursa(job #2173560)

Utilizator mouse_wirelessMouse Wireless mouse_wireless Data 15 martie 2018 22:48:01
Problema Dezastru Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 3 kb
#include<cstdio>
#include<cassert>

#ifdef INFOARENA
#define ProblemName "dezastru"
#endif

#define MCONCAT(A, B) A B
#ifdef ProblemName
#define InFile MCONCAT(ProblemName, ".in")
#define OuFile MCONCAT(ProblemName, ".out")
#else
#define InFile "fis.in"
#define OuFile "fis.out"
#endif

double rez;
double p[28];
int N, K;
int combs;

inline void bkt(int l, int lastidx, double cur) {
  if (l == K) {
    rez += cur;
    ++combs;
    return;
  }
  for (register int i = lastidx + 1; i <= N - K + l; ++i)
    bkt(l + 1, i, cur * p[i]);
}

#define REP(x,y) for (register int i##x = i##y + 1; i##x <= N - K + x; ++i##x)
#define CUR(x,y) cur##x = cur##y * p[i##y];

inline void bkt_12() {
  double cur0, cur1, cur2, cur3, cur4, cur5, cur6, cur7, cur8, cur9, cur10, cur11;
  cur0 = 1.0;
  combs = 5200300;
  for (register int i0 = 0; i0 <= N - K; ++i0) {
    cur1 = cur0 * p[i0];
    REP(1, 0) {
      CUR(2, 1);
      REP(2, 1) {
        CUR(3, 2);
        REP(3, 2) {
          CUR(4, 3);
          REP(4, 3) {
            CUR(5, 4);
            REP(5, 4) {
              CUR(6, 5);
              REP(6, 5) {
                CUR(7, 6);
                REP(7, 6) {
                  CUR(8, 7);
                  REP(8, 7) {
                    CUR(9, 8);
                    REP(9, 8) {
                      CUR(10, 9);
                      REP(10, 9) {
                        CUR(11, 10);
                        rez += cur11;
                      }
                    }
                  }
                }
              }
            }            
          }
        }
      }
    }
  }
}

inline void bkt_13() {
  double cur0, cur1, cur2, cur3, cur4, cur5, cur6, cur7, cur8, cur9, cur10, cur11, cur12;
  cur0 = 1.0;
  combs = 5200300;
  for (register int i0 = 0; i0 <= N - K; ++i0) {
    cur1 = cur0 * p[i0];
    REP(1, 0) {
      CUR(2, 1);
      REP(2, 1) {
        CUR(3, 2);
        REP(3, 2) {
          CUR(4, 3);
          REP(4, 3) {
            CUR(5, 4);
            REP(5, 4) {
              CUR(6, 5);
              REP(6, 5) {
                CUR(7, 6);
                REP(7, 6) {
                  CUR(8, 7);
                  REP(8, 7) {
                    CUR(9, 8);
                    REP(9, 8) {
                      CUR(10, 9);
                      REP(10, 9) {
                        CUR(11, 10);
                        REP(11, 10) {
                          CUR(12, 11);
                          rez += cur12;
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

int main() {
  freopen(InFile, "r", stdin);
  freopen(OuFile, "w", stdout);
  scanf("%d%d", &N, &K);
  for (int i = 0; i < N; ++i)
    scanf("%lf", &p[i]);
  if (N == 25 && K == 12)
    bkt_12();
  else if (N == 25 && K == 13)
    bkt_13();
  else bkt(0, -1, 1.0);
  printf("%.6lf\n", rez / combs);
  return 0;
}