题目链接

https://atcoder.jp/contests/abc127/tasks/abc127_e

题意

给定一个矩阵,包含 $N \times M$ 个格子,现在从中选出 $K \leq N \times M$ 个不同的格子,记为 $(x_1,y_1), (x_2, y_2), … , (x_K, y_K)$ ,记

$cost = \sum\limits_{i=1}^{K-1}\sum\limits_{j=i+1}^{K}(|x_i-x_j| + |y_i-y_j|)$

求:对于所有不同的 $K$ 个格子的选法,$cost$ 的sum为多少?

法一概率

选 $k$ 个格子的方案数为 $C(n+m, k)$,在 $k$ 个格子中,任选 $2$ 个出来,有 $C(k,2)$ 种,考虑它们的贡献:

因为是全部方案,所以可以考虑用 期望值 来做!

问题转化为,从 $N \times M$ 的矩阵中,选择 $2$ 个不同的点 $(x_i, y_i), (x_j,y_j)$ ,求 $|x_i - x_j| + |y_i-y_j|$ 的期望?

期望为: $\frac{n+m}{3}$


如果推式子很难,这里是一些小技巧(仅用于 分母中无 $n,m$ ,并且分子中不存在 $nm$ 之类的项):

打表找规律:假设期望值 $E(n,m)$ 是一个关于 $n,m$ 的多项式,那么固定一下 $n$ 的值,然后让 $m = 1,2,3…$ 来打表找出 $E(n,m)$ 和 $m$ 的关系。同理可以找出 $E(n,m)$ 和 $n$ 的关系,相加一下就可以了。

拉格朗日插值法:设 $ans = F(n,m) = E(n,m) * C(nm, 2)$,我们可以固定 $n$,然后用插值法找出 $F(n,m)$ 和 $m$ 的关系。(这个函数有两个变量,按理说应该是固定每一个 $n$ 然后对每一个 $n$ 都进行一次插值法的,以后遇到了可以尝试一下。)


严谨证明:

考虑一个点 $(x,y)$,那么

纵向贡献 为: $v_{x,y} = [(1+2+…+x-1) + (1+2+…+n-x)] * m$

横向贡献 为: $h_{x,y} = [(1+2+…y-1) + (1+2+…+m-y)] * n$

期望就是 $E(n,m) = \frac{\sum\limits_{x=1}^n \sum\limits_{y=1}^m (v_{x,y} + h_{x,y})}{C(nm,2)} = \frac{n+m}{3}$


以上,最终的答案就是

$ans = C(nm,k) * C(k,2) * \frac{n+m}{3}$

法二计数

我们选择 $2$ 个格子,有 $C(nm-2, k-2)$ 种。

对于横坐标的差值为 $d_x$ 的情况,有 $(n-d_x) m^2$ 种。贡献就是 $(n-d_x)m^2*d_x$

对于纵坐标的差值为 $d_y$ 的情况,有 $(m-d_y) n^2$ 种。贡献就是 $(m-d_y) n^2*d_y$

所以答案就是

$ans = C(nm-2, k-2) (\sum\limits_{d_x=1}^{n-1} (n-d_x)m^2*d_x + \sum\limits_{d_y=1}^{m-1} (m-d_y)n^2*d_y)$

代码
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;
}

参考链接

  1. https://blog.csdn.net/weixin_30323631/article/details/96351727
  2. https://blog.csdn.net/qq_40655981/article/details/90642350

一些数学知识

Q1. 如果不限定坐标为整数,长度为 $n$ 的线段上任取两个点,距离期望值是?

A1. 答案为 $\frac{n}{3}$,有两种方法。

第一种:先假设坐标只能为 $1,2,…,n$ 的整数,那么求出的期望是 $E_n = 2\times \frac{\sum\limits_{i=1}^{n}i(n-i)}{n^2} = \frac{n^2-1}{3n}$,取一个 $n$ 趋向无穷,就有 $E = \lim_{n \to \infty} \frac{n^2-1}{3n} = \frac{n}{3}$

上述推导需要用到 $1^2 + 2^2 + … + n^2 = \frac{1}{6}n(n+1)(2n+1)$

第二种:先假设线段长度为 $1$,则有期望为 $\frac{\int_{0}^1 \int_{0}^1 |x-y| ~dydx}{\int_{0}^1 \int_{0}^1 1~ dydx} = \int_{0}^1 \int_{0}^x (x-y) ~ dydx + \int_{0}^1 \int_{x}^1 (y-x) ~dydx = \frac{1}{3}$,对于线段长度为 $n$,乘上 $n$ 即可。(记得分母要除以样本空间,即 $\int_{0}^1 \int_{0}^1 1~ dydx$)


Q2. 如果不限定坐标为整数,$n \times n$ 的正方形中任取两个点,距离期望值是?

A2. 答案约为 $0.521$,具体分析可以见 这里这里

其他例题(TODO)

  1. https://www.luogu.com.cn/problem/P4781