Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int md = 1000000007;
- inline void add(int &a, int b) {
- a += b;
- if (a >= md) {
- a -= md;
- }
- }
- inline int mul(int a, int b) {
- return (long long) a * b % md;
- }
- inline int power(int a, int b) {
- int res = 1;
- while (b > 0) {
- if (b & 1) {
- res = mul(res, a);
- }
- b >>= 1;
- a = mul(a, a);
- }
- return res;
- }
- inline int inv(int x) {
- return power(x, md - 2);
- }
- const int N = 2222;
- int a[N];
- int dp[N][N], sum[N][N];
- int main() {
- int n;
- scanf("%d", &n);
- for (int i = 0; i < n; i++) {
- scanf("%d", a + i);
- }
- for (int i = 0; i <= n; i++) {
- for (int j = 0; j <= i; j++) {
- sum[i][j] = 0;
- }
- }
- sum[0][0] = 1;
- for (int i = 0; i < n; i++) {
- for (int j = 0; j <= i; j++) {
- add(sum[i + 1][j], sum[i][j]);
- add(sum[i + 1][j + 1], mul(sum[i][j], a[i]));
- }
- }
- 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], mul(dp[i - 1][j - 1], j * (j - 1) / 2));
- add(dp[i][j], mul(dp[i - 1][j], j * (i - j) + (i - j) * (i - j - 1)));
- }
- }
- int ans = 0;
- for (int j = 1; j <= n; j++) {
- add(ans, mul(sum[n][j], dp[n][j]));
- }
- int ways = 1;
- while (n >= 2) {
- ways = mul(ways, mul(n, n - 1));
- n--;
- }
- printf("%d\n", mul(ans, inv(ways)));
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment