0
点赞
收藏
分享

微信扫一扫

[Acwing] 1309. 车的放置 排列组合+费马小定理

窗外路过了谁 2022-04-14 阅读 43
c++

前言

传送门 :

思路

我们将这个图,分成两个矩形

设我们在上面放了 i i i个车

我们考虑先选择行再选择列,因此对于行有 C b i C_{b}^i Cbi

对于列有 A a i A_a^i Aai , 因此上面的选择的总方案数就是 C b i ∗ A a i C_b^i*A_a^i CbiAai

因此对于下半我们还需要选择 k − i k-i ki 个车

同理对于行有 C d k − i C_d^{k-i} Cdki

对于列考虑,因为上面已经选择了列,所以列的考虑就是 A a + c − i k − i A_{a+c-i}^{k-i} Aa+ciki

所以下面的总方案数就是 C d k − i ∗ A a + c − i k − i C_d^{k-i}*A_{a+c-i}^{k-i} CdkiAa+ciki

Mycode

map<int,int> mp;
const int N = 2010,mod = 1e5+3;
int fact[N],infact[N];

int qmi(int a,int k){
	int res  = 1;
	while(k){
		if(k&1) res = 1ll*res*a%mod;
		a = 1ll*a*a%mod;
		k>>=1;
	}
	return res;
}

int C(int a,int b){
	if(a<b)return 0;
	return 1ll*fact[a]*infact[a-b]%mod*infact[b]%mod;
}
int P(int a,int b){
	if(a<b)return 0;
	return 1ll*fact[a]*infact[a-b]%mod;
}
void solve(){
	infact[0] = fact[0] = 1;
	for(int i=1;i<N; i ++ ){
		fact[i] = 1ll*fact[i-1]*i%mod;
		infact[i] = 1ll*infact[i-1]*qmi(i,mod-2)%mod;
	}
	
	int  a,b,c,d,k;
	cin>>a>>b>>c>>d>>k;
	
	int res = 0 ;
	for(int i =0  ; i<= k ; i ++ ){
		res = (res +1ll*C(b,i)*P(a,i)%mod*C(d,k-i)%mod*P(a+c-i,k-i))%mod;
	}
	cout<<res<<endl;
	
}
举报

相关推荐

0 条评论