#2 #7 #9 WA,求找虫子
  • 板块P1350 车的放置
  • 楼主tongyf
  • 当前回复4
  • 已保存回复4
  • 发布时间2020/9/29 12:13
  • 上次更新2023/11/5 12:26:48
查看原帖
#2 #7 #9 WA,求找虫子
247540
tongyf楼主2020/9/29 12:13

用的不是递推,是直接数学方法

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e5+3;
int a,b,c,d,k,f[2005][2005],jc[2005],inv[2005];
int read(){
	int f=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') w=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		f=f*10+ch-'0';
		ch=getchar();
	}
	return f*w;
}
int qpow(int x,int y){
	int ans=1;
	while(y){
		if(y&1) ans=ans*x%mod;
		x=x*x%mod;
		y>>=1;
	} 
	return ans;
}
void init(){
	jc[0]=inv[0]=1;
	for(int i=1;i<=2000;i++){
		jc[i]=jc[i-1]*i%mod;
		inv[i]=qpow(jc[i],mod-2);
	}
	f[0][0]=f[1][0]=f[1][1]=1;
	for(int i=2;i<=2000;i++){
		f[i][0]=1;
		for(int j=1;j<=i;j++){
			f[i][j]=(f[i-1][j-1]+f[i-1][j])%mod;
		}
	}
}
int mul(int x,int y){
	if(x<y) return 1;
	else return jc[x]*inv[y-1]%mod;
}
int solve(){
	int ans=0;
	init();
	for(int i=0;i<=min(a,b);i++){
		for(int j=0;j<=min(c,d);j++){
			if(i+j>k) break;
			 ans=(ans+f[a][i]*mul(b,b-i+1)%mod*f[c][j]%mod*mul(d,d-j+1)%mod*f[a-i][k-i-j]%mod*mul(d-j,d-k+i+1)%mod)%mod;
		}
	}
	return ans;
}
signed main(){
	a=read(),b=read(),c=read(),d=read(),k=read();
	printf("%lld\n",solve());
	return 0;
}

2020/9/29 12:13
加载中...