Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define pb push_back
- #define mp(x, y) make_pair(x, y)
- #define sz(c) ((int)c.size())
- typedef long long ll;
- typedef vector<int> vi;
- typedef vector<vector<int> > vvi;
- const int mod = (int)1e9 + 7;
- void add (int &a, int b)
- {
- a += b;
- if (a >= mod)
- a -= mod;
- }
- int mult (int a, int b)
- {
- return (ll)a * b % mod;
- }
- vi prod (const vi &left, const vi &right)
- {
- vi ans(sz(left) + sz(right) - 1);
- for (int i = 0; i < sz(left); i++)
- for (int j = 0; j < sz(right); j++)
- add(ans[i + j], mult(left[i], right[j]));
- return ans;
- }
- void solve (int n)
- {
- vi x(n);
- for (int i = 0; i < n; i++)
- cin >> x[i];
- vvi dp(n + 1, vi(n + 1));
- dp[1][1] = 1;
- for (int i = 2; i <= n; i++)
- {
- for (int j = 1; j <= i; j++)
- {
- dp[i][j] = 0;
- add(dp[i][j], mult(j, mult(i - j, dp[i - 1][j])));
- if (i - j >= 2)
- add(dp[i][j], mult(i - j, mult(i - j - 1, dp[i - 1][j])));
- if (j >= 2)
- {
- int c2 = ((ll)j * (ll)(j - 1) / 2) % mod;
- add(dp[i][j], mult(c2, dp[i - 1][j - 1]));
- }
- }
- }
- vi ans(1, 1);
- for (int i = 0; i < n; i++)
- ans = prod(ans, {1, x[i]});
- int res = 0;
- for (int i = 1; i <= n; i++)
- add(res, mult(ans[i], dp[n][i]));
- vi inv(n + 1);
- inv[1] = 1;
- for (int i = 2; i <= n; i++)
- {
- inv[i] = mult(mod / i, inv[mod % i]);
- inv[i] = mod - inv[i];
- assert(mult(inv[i], i) == 1);
- }
- for (int i = n; i >= 2; i--)
- res = mult(res, inv[i]),
- res = mult(res, inv[i - 1]);
- cout << res << endl;
- }
- int main() {
- ios_base::sync_with_stdio(false);
- cin.tie(0);
- int n;
- while (cin >> n)
- solve (n);
- cerr << (double)clock() / CLOCKS_PER_SEC << "\n";
- return 0;
- }
Add Comment
Please, Sign In to add comment