P1350 车的放置(排列组合模板题目)

/*
将这个L形网格分成两个矩形,

一个长为 a 宽为 b+d ,

另一个长为 c 宽为 d .

分别计算将 k 个车将 i 个车放置在左边的矩形里,将 k−i 个车放在右边的矩形里,

问题就转化为了求在矩形中能放置几个车使其互不攻击

在一个 n×m 的矩形中使得 i 个车互不攻击,

可以从 n 行中任选 i 行,从 m 列中任选 i 列使其被限制在这个“正方形”中,

又因为在这个 i×i 大小的正方形中进行排列组合时,

第一行有 i 种选择方法,第二行有 i−1 种选择方法 …… 第 i 行只有 1 种选择方法。

则在 n×m 的矩形中使得 i 个车互不攻击的方案数为 C(n,i)×C(m,i)×i!

但是题目中还需要考虑两个矩形之间的互相冲突情况:

因为在 c×d 的矩形中有 k−i 个车,

那么就已经占据了 k−i 行,

故在 a×(b+d) 的矩形中只有 b+d−(k−i) 行能被使用。

所以最终答案为C(a,i)*C(b+d-k+i,i)*i!*C(c,k-i)*C(d,k-i)*(k-i)!
*/
#include<iostream>

using namespace std;

const int N=2e3,mod=100003;
using ll=long long;
int a,b,c,d,k;
ll dp[N+1][N+1];
ll C[N+1][N+1],fac[N+1];

int main(){
	cin.tie(nullptr)->sync_with_stdio(false);
	cin>>a>>b>>c>>d>>k;
	for(int i=0;i<=N;i++){
		C[i][0]=C[i][i]=1;
		for(int j=1;j<=N;j++) C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
	}
	fac[0]=1;
	for(int i=1;i<=N;i++) fac[i]=fac[i-1]*i%mod;
	ll ans=0;
	for(int i=0;i<=k;i++)
		ans=(ans+C[a][i]*C[b+d-k+i][i]%mod*fac[i]%mod*C[c][k-i]%mod*C[d][k-i]%mod*fac[k-i]%mod)%mod;
	cout<<ans<<'\n';
	return 0;
}

posted on 2026-04-28 15:46  _CENSORED  阅读(7)  评论(0)    收藏  举报

导航