1 条题解
-
0
博客园食用体验更佳:https://www.cnblogs.com/Milkcatqwq/p/17504069.html
Descirption
Solution
若定义 为一行有 个 的方案数,则 。
定义 , 的意义就是一行至少有 个 的方案数。
如果 ,那么 的一行有 种方案, 的一行有 种方案,所以每行有 种方案,总方案就是 。注意全部 是不合法的,要减掉。
则 $\displaystyle E=\sum_{i=0}^{m}i\cdot((f(i)+g(i+1))^n-g(i+1)^n)$。
然后就可以求啦,时间复杂度 。
Code
#include <bits/stdc++.h> using namespace std; namespace Milkcat { typedef long long LL; const int N = 1e6 + 5, mod = 1e9 + 7; LL qpow(LL bas, LL k) { LL ans = 1; for (; k; bas = bas * bas % mod, k >>= 1) if (k & 1) ans = ans * bas % mod; return ans; } struct Combinations { LL mod, f[N], fac[N], inv[N], Finv[N]; void init(LL n, LL pmod) { mod = pmod, inv[1] = 1, fac[0] = Finv[0] = 1; for (int i = 2; i <= n; i ++) inv[i] = ((mod - mod / i) * inv[mod % i]) % mod; for (int i = 1; i <= n; i ++) fac[i] = fac[i - 1] * i % mod, Finv[i] = Finv[i - 1] * inv[i] % mod; } LL operator () (LL n, LL m) { if (m > n) return 0; return fac[n] * Finv[m] % mod * Finv[n - m] % mod; } } C; LL n, m, x, y, ans, f[N], g[N]; int main() { cin >> n >> m >> x >> y, C.init(m, mod); for (int i = 0; i <= m; i ++) f[i] = C(m, i) * qpow(y, i) % mod * qpow(x, m - i) % mod; for (int i = m; i >= 0; i --) g[i] = (g[i + 1] + f[i]) % mod; for (int i = 0; i <= m; i ++) ans = (ans + i * (qpow(f[i] + g[i + 1], n) - qpow(g[i + 1], n) + mod) % mod) % mod; cout << ans << '\n'; return 0; } } int main() { int T = 1; while (T --) Milkcat::main(); return 0; }
- 1
信息
- ID
- 494
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 18
- 已通过
- 5
- 上传者