CF128C Games with Rectangle

https://www.luogu.com.cn/problem/CF128C

行列分开考虑,然后再乘起来

容易发现,对于行,其实就是要在 n − 1 n-1 n1里面选 2 k 2k 2k个点作为左右端点

列同理,答案就是
( n − 1 2 k ) ( m − 1 2 k ) \binom{n-1}{2k}\binom{m-1}{2k} (2kn1)(2km1)

code:

#include<bits/stdc++.h>
#define N 2000050
#define mod 1000000007
#define ll long long
using namespace std;
ll qpow(ll x, ll y) {
    ll ret = 1;
    for(; y; y >>= 1, x = x * x % mod) if(y & 1) ret = ret * x % mod;
    return ret;
}
ll fac[N], ifac[N];
ll C(int x, int y) {
    if(x < y) return 0;
    return fac[x] * ifac[y] % mod * ifac[x - y] % mod;
}
void init(int n) {
    fac[0] = 1;
    for(int i = 1; i <= n; i ++) fac[i] = fac[i - 1] * i % mod;
    ifac[n] = qpow(fac[n], mod - 2);
    for(int i = n - 1; i >= 0; i --) ifac[i] = ifac[i + 1] * (i + 1) % mod;
}
int n, m, k;
int main() {
    scanf("%d%d%d", &n, &m, &k);
    init(max(n, m));
    printf("%lld", C(n - 1, 2 * k) * C(m - 1, 2 * k) % mod);
    return 0;
}
posted @ 2021-10-14 07:48  lahlah  阅读(36)  评论(0编辑  收藏  举报