CF128C Games with Rectangle
https://www.luogu.com.cn/problem/CF128C
行列分开考虑,然后再乘起来
容易发现,对于行,其实就是要在 n − 1 n-1 n−1里面选 2 k 2k 2k个点作为左右端点
列同理,答案就是
(
n
−
1
2
k
)
(
m
−
1
2
k
)
\binom{n-1}{2k}\binom{m-1}{2k}
(2kn−1)(2km−1)
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;
}