提交时间:2025-01-03 16:00:59

运行 ID: 35806

#include <cstdio> #include <iostream> using namespace std; const int N = 155, mod = 1e9 + 7, w = 150; int n, p1, p2, p3, p4, s, tot; int p[N], fac[N], ifac[N]; int pw1[N], pw2[N], pw3[N], pw4[N]; int g[N][N << 1][N << 1], f[N][N << 1][N << 1]; int add(int x, int y) { return x + y < mod ? x + y : x + y - mod; } int sub(int x, int y) { return x < y ? x + mod - y : x - y; } int power(int a, int n) { int tp = 1; while (n) { if (n & 1) tp = 1ll * tp * a % mod; a = 1ll * a * a % mod, n >>= 1; } return tp; } void prep(int n) { fac[0] = 1; for (int i = 1; i <= n; i++) fac[i] = 1ll * fac[i - 1] * i % mod; ifac[n] = power(fac[n], mod - 2); for (int i = n - 1; ~i; i--) ifac[i] = 1ll * ifac[i + 1] * (i + 1) % mod; pw1[0] = pw2[0] = pw3[0] = pw4[0] = 1; for (int i = 1; i <= n; i++) { pw1[i] = 1ll * pw1[i - 1] * p1 % mod; pw2[i] = 1ll * pw2[i - 1] * p2 % mod; pw3[i] = 1ll * pw3[i - 1] * p3 % mod; pw4[i] = 1ll * pw4[i - 1] * p4 % mod; } for (int i = 0; i <= n; i++) { pw1[i] = 1ll * pw1[i] * ifac[i] % mod; pw2[i] = 1ll * pw2[i] * ifac[i] % mod; pw3[i] = 1ll * pw3[i] * ifac[i] % mod; pw4[i] = 1ll * pw4[i] * ifac[i] % mod; } } int main() { cin >> n >> p1 >> p2 >> p3 >> p4; prep(n); for (int i = 0; i <= n; i++) for (int a = 0; a <= i; a++) for (int b = 0; a + b <= i; b++) for (int c = 0; a + b + c <= i; c++) { int d = i - a - b - c; g[i][a - b + w][c - d + w] = (g[i][a - b + w][c - d + w] + 1ll * fac[i] * pw1[a] % mod * pw2[b] % mod * pw3[c] % mod * pw4[d]) % mod; } p[0] = 1; for (int i = 1; i <= n; i++) { for (int j = i - 2; j >= 0; j--) p[i] = (p[i] + 1ll * p[j] * g[i - j][w][w]) % mod; p[i] = sub(1, p[i]); } for (int i = 0; i <= n; i++) { for (int j = i - 2; j > 0; j -= 2) for (int a = -j; a <= j; a++) for (int b = -(j - abs(a)); b <= j - abs(a); b++) f[i][w + a][w + b] = sub(f[i][w + a][w + b], 1ll * f[j][w + a][w + b] * g[i - j][w][w] % mod); for (int j = i + 1; j <= n; j++) for (int a = -(j - i); a <= j - i; a++) for (int b = -(j - i - abs(a)); b <= j - i - abs(a); b += 2) if (a || b) f[j][w - a][w - b] = (f[j][w - a][w - b] + 1ll * (p[i] + mod - f[i][w + a][w + b]) * g[j - i][w + a][w + b]) % mod; } int ex = 0; for (int i = 0; i <= n; i++) ex = add(ex, p[i]); long long ans = ex; for (int i = 1; i <= n; i++) for (int a = -i; a <= i; a++) for (int b = -(i - abs(a)); b <= i - abs(a); b++) ans += 2 * f[i][w + a][w + b]; ans = (ans - 1ll * ex * ex) % mod; cout << (ans + mod) % mod << '\n'; }