题目链接
https://atcoder.jp/contests/abc127/tasks/abc127_e
题意
给定一个矩阵,包含 个格子,现在从中选出 个不同的格子,记为 ,记
求:对于所有不同的 个格子的选法, 的sum为多少?
法一概率
选 个格子的方案数为 ,在 个格子中,任选 个出来,有 种,考虑它们的贡献:
因为是全部方案,所以可以考虑用 期望值 来做!
问题转化为,从 的矩阵中,选择 个不同的点 ,求 的期望?
期望为:
如果推式子很难,这里是一些小技巧(仅用于 分母中无 ,并且分子中不存在 之类的项):
打表找规律:假设期望值 是一个关于 的多项式,那么固定一下 的值,然后让 来打表找出 和 的关系。同理可以找出 和 的关系,相加一下就可以了。
拉格朗日插值法:设 ,我们可以固定 ,然后用插值法找出 和 的关系。(这个函数有两个变量,按理说应该是固定每一个 然后对每一个 都进行一次插值法的,以后遇到了可以尝试一下。)
严谨证明:
考虑一个点 ,那么
纵向贡献 为:
横向贡献 为:
期望就是
以上,最终的答案就是
法二计数
我们选择 个格子,有 种。
对于横坐标的差值为 的情况,有 种。贡献就是
对于纵坐标的差值为 的情况,有 种。贡献就是
所以答案就是
代码
copy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| using namespace std; #include <bits/stdc++.h> #define ll long long const int mod = 1e9+7; const int maxn = 2e5+5; ll qpow(ll a, ll b) { ll res = 1; while (b) { if (b&1) (res *= a) %= mod; (a *= a) %= mod; b >>= 1; } return res; } ll inv(ll a) { return qpow(a, mod-2); } ll n,m,k; ll fac[maxn]; void init() { fac[0] = 1; fac[1] = 1; for (int i = 2; i <= n*m; i++) { fac[i] = (fac[i-1] * (ll)(i)) % mod; } } int main() { cin >> n >> m >> k; init(); ll nu = fac[n*m] * k % mod * (k-1) % mod * (n+m) % mod; ll de = inv(fac[k]) * inv(fac[n*m-k]) % mod * inv(6) % mod; cout << (nu * de) % mod << endl; }
|
参考链接
- https://blog.csdn.net/weixin_30323631/article/details/96351727
- https://blog.csdn.net/qq_40655981/article/details/90642350
一些数学知识
Q1. 如果不限定坐标为整数,长度为 的线段上任取两个点,距离期望值是?
A1. 答案为 ,有两种方法。
第一种:先假设坐标只能为 的整数,那么求出的期望是 ,取一个 趋向无穷,就有
上述推导需要用到
第二种:先假设线段长度为 ,则有期望为 ,对于线段长度为 ,乘上 即可。(记得分母要除以样本空间,即 )
Q2. 如果不限定坐标为整数, 的正方形中任取两个点,距离期望值是?
A2. 答案约为 ,具体分析可以见 这里 和 这里
其他例题(TODO)
- https://www.luogu.com.cn/problem/P4781
Author
tom0727
LastMod
2025-05-01
(d141563)
,更新历史
License
CC BY-SA 4.0