func_code_string: #include <bits/stdc++.h>   using namespace std;   template <typename T>   T gcd(T a, T b) {     if (a == 0) return b;     return gcd(b % a, a);   }   template <typename T>   T pow(T a, T b, long long m) {     T ans = 1;     while (b > 0) {       if (b % 2 == 1) ans = ((ans % m) * (a % m)) % m;       b /= 2;       a = ((a % m) * (a % m)) % m;     }     return ans % m;   }   double fac[55];   double c[55][55];   void factorial() {     fac[0] = 1.00;     for (int i = 1; i <= 50; i++) {       fac[i] = fac[i - 1] * (double)i;     }   }   int n, m;   int a[55];   double pw(double base, int exp) {     double ans = 1.00;     for (int i = 0; i < exp; i++) ans *= base;     return ans;   }   double dp[55][55][55];   bool vis[55][55][55];   double solve(int id, int cnt, int maxSoFar) {     if (id == (m)) {       if (cnt == 0)         return maxSoFar;       else         return 0.00;     }     if (vis[id][cnt][maxSoFar]) return dp[id][cnt][maxSoFar];     vis[id][cnt][maxSoFar] = 1;     double ans = 0.00;     for (int i = 0; i <= cnt; i++) {       ans += c[cnt][i] *              solve(id + 1, cnt - i, max((a[id] + i - 1) / a[id], maxSoFar));     }     return dp[id][cnt][maxSoFar] = ans;   }   int main() {     cin >> n >> m;     factorial();     for (int i = 0; i < m; i++) cin >> a[i];     for (int i = 0; i <= 50; i++) {       c[i][0] = 1.00;       c[i][i] = 1.00;     }     for (int i = 2; i <= 50; i++) {       for (int j = 1; j < i; j++) {         c[i][j] = c[i - 1][j] + c[i - 1][j - 1];       }     }     double ans = solve(0, n, 0);     ans /= pw(m, n);     cout << fixed << setprecision(12) << ans;   }   