niyaznigmatullin

Untitled

Feb 15th, 2016
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.41 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int md = 1000000007;
  6.  
  7. inline void add(int &a, int b) {
  8.   a += b;
  9.   if (a >= md) {
  10.     a -= md;
  11.   }
  12. }
  13.  
  14. inline int mul(int a, int b) {
  15.   return (long long) a * b % md;
  16. }
  17.  
  18. inline int power(int a, int b) {
  19.   int res = 1;
  20.   while (b > 0) {
  21.     if (b & 1) {
  22.       res = mul(res, a);
  23.     }
  24.     b >>= 1;
  25.     a = mul(a, a);
  26.   }
  27.   return res;
  28. }
  29.  
  30. inline int inv(int x) {
  31.   return power(x, md - 2);
  32. }
  33.  
  34. const int N = 2222;
  35.  
  36. int a[N];
  37. int dp[N][N], sum[N][N];
  38.  
  39. int main() {
  40.   int n;
  41.   scanf("%d", &n);
  42.   for (int i = 0; i < n; i++) {
  43.     scanf("%d", a + i);
  44.   }
  45.   for (int i = 0; i <= n; i++) {
  46.     for (int j = 0; j <= i; j++) {
  47.       sum[i][j] = 0;
  48.     }
  49.   }
  50.   sum[0][0] = 1;
  51.   for (int i = 0; i < n; i++) {
  52.     for (int j = 0; j <= i; j++) {
  53.       add(sum[i + 1][j], sum[i][j]);
  54.       add(sum[i + 1][j + 1], mul(sum[i][j], a[i]));
  55.     }
  56.   }
  57.   dp[1][1] = 1;
  58.   for (int i = 2; i <= n; i++) {
  59.     for (int j = 1; j <= i; j++) {
  60.       dp[i][j] = 0;
  61.       add(dp[i][j], mul(dp[i - 1][j - 1], j * (j - 1) / 2));
  62.       add(dp[i][j], mul(dp[i - 1][j], j * (i - j) + (i - j) * (i - j - 1)));
  63.     }
  64.   }
  65.   int ans = 0;
  66.   for (int j = 1; j <= n; j++) {
  67.     add(ans, mul(sum[n][j], dp[n][j]));
  68.   }
  69.   int ways = 1;
  70.   while (n >= 2) {
  71.     ways = mul(ways, mul(n, n - 1));
  72.     n--;
  73.   }
  74.   printf("%d\n", mul(ans, inv(ways)));
  75.   return 0;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment