车的放置

车的放置


这道题首先我们可以考虑特殊的情况:

  • 当给定的图形为矩形的时候:我们有(C_L^k*A_W^k)

那么,对于不规则的图形,我们其实也可以通过分割为上下两个独立的矩形计算。

具体来说:我们可以枚举在上面的有(i)和车,上下进行乘法原理计算。

这道题其实很有启发意义:如果遇到一个题目无法直接计算,可以通过分割的手段分别来计算,最后通过加法原理累和答案。

……
int a, b, c, d, k, jc[N], jc_inv[N];
int power(int x, int y)
{
	int res = 1;
	while(y)
	{
		if(y & 1) res = 1ll * res * x % mod;
		y >>= 1;
		x = 1ll * x * x % mod;
	}
	return res;
}
void init()
{
	CLR(jc, 0), CLR(jc_inv, 0);
	jc[0] = 1;
	FOR(i, 1, 2001) jc[i] = 1ll * jc[i - 1] * i % mod;
	jc_inv[2001] = power(jc[2001], mod - 2);
	ROF(i, 2000, 0) jc_inv[i] = 1ll * jc_inv[i + 1] * (i + 1) % mod;
	return;
}
int C(int x, int y)
{
	if(x > y) return 0;
	return 1ll * jc[y] * jc_inv[y - x] % mod * jc_inv[x] % mod; 
}
int A(int x, int y)
{
	if(x > y) return 0;
	return 1ll * jc[y] * jc_inv[y - x] % mod;
}
int main()
{
	init();
	scanf("%d %d %d %d %d", &a, &b, &c, &d, &k);
	long long ans = 0, j;
	for(int i = 0; i <= k; ++ i)
	{
		j = k - i;
		ans += 1ll * C(i, b) * A(i, a) % mod * C(j, d) % mod * A(j, a + c - i) % mod;
		ans %= mod;
	}
	printf("%lld
", ans);
	return 0;
} 
原文地址:https://www.cnblogs.com/zach20040914/p/14346988.html