Guest User

Untitled

a guest
Feb 14th, 2016
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.76 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define pb push_back
  6. #define mp(x, y) make_pair(x, y)
  7. #define sz(c) ((int)c.size())
  8. typedef long long ll;
  9. typedef vector<int> vi;
  10. typedef vector<vector<int> > vvi;
  11.  
  12. const int mod = (int)1e9 + 7;
  13. void add (int &a, int b)
  14. {
  15. a += b;
  16. if (a >= mod)
  17. a -= mod;
  18. }
  19. int mult (int a, int b)
  20. {
  21. return (ll)a * b % mod;
  22. }
  23.  
  24. vi prod (const vi &left, const vi &right)
  25. {
  26. vi ans(sz(left) + sz(right) - 1);
  27. for (int i = 0; i < sz(left); i++)
  28. for (int j = 0; j < sz(right); j++)
  29. add(ans[i + j], mult(left[i], right[j]));
  30. return ans;
  31. }
  32.  
  33. void solve (int n)
  34. {
  35. vi x(n);
  36. for (int i = 0; i < n; i++)
  37. cin >> x[i];
  38.  
  39. vvi dp(n + 1, vi(n + 1));
  40. dp[1][1] = 1;
  41. for (int i = 2; i <= n; i++)
  42. {
  43. for (int j = 1; j <= i; j++)
  44. {
  45. dp[i][j] = 0;
  46. add(dp[i][j], mult(j, mult(i - j, dp[i - 1][j])));
  47. if (i - j >= 2)
  48. add(dp[i][j], mult(i - j, mult(i - j - 1, dp[i - 1][j])));
  49. if (j >= 2)
  50. {
  51. int c2 = ((ll)j * (ll)(j - 1) / 2) % mod;
  52. add(dp[i][j], mult(c2, dp[i - 1][j - 1]));
  53. }
  54. }
  55. }
  56.  
  57. vi ans(1, 1);
  58. for (int i = 0; i < n; i++)
  59. ans = prod(ans, {1, x[i]});
  60.  
  61. int res = 0;
  62. for (int i = 1; i <= n; i++)
  63. add(res, mult(ans[i], dp[n][i]));
  64.  
  65. vi inv(n + 1);
  66. inv[1] = 1;
  67. for (int i = 2; i <= n; i++)
  68. {
  69. inv[i] = mult(mod / i, inv[mod % i]);
  70. inv[i] = mod - inv[i];
  71. assert(mult(inv[i], i) == 1);
  72. }
  73.  
  74. for (int i = n; i >= 2; i--)
  75. res = mult(res, inv[i]),
  76. res = mult(res, inv[i - 1]);
  77.  
  78. cout << res << endl;
  79. }
  80.  
  81. int main() {
  82. ios_base::sync_with_stdio(false);
  83. cin.tie(0);
  84.  
  85. int n;
  86. while (cin >> n)
  87. solve (n);
  88.  
  89. cerr << (double)clock() / CLOCKS_PER_SEC << "\n";
  90.  
  91. return 0;
  92. }
Add Comment
Please, Sign In to add comment