啊啊啊啊啊没有组合数学的题单我怎么一直切水题啊$QAQ$
先设$f(n,m,k)$为在$n\times m$的矩形中放$k$个车的方案。
把这个阶梯状的棋盘分割成两个$a\times b$和$(a+c)\times d$的矩形。
然后枚举在这两个矩形放几个车。
答案就是$\sum\limits_{i=0}^kf(a,b,i)f(a+c-i,d,k-i)$
再来处理$f$。
显然在一个$n\times n$的棋盘里放$n$个车的方案数为$n!$。
从$n\times m$的棋盘里抽出一个$k\times k$的棋盘,有$C_n^kC_m^k$中方案。
那么$f(n,m,k)=C_n^kC_m^kk!$,注意特判$k>n,m$的情况。
这题就没了。
(数据范围明明可以开到$1e7$或者套个卢卡斯啊)
之所以挂上枚举的标签是因为我觉得这就是枚举(雾
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#define maxn 3005
#define inf 0x3f3f3f3f
const int mod = 100003;
using namespace std;
inline int read(){
int x=0,y=0;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')y=1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return y?-x:x;
}
int fac[maxn]={1},inv[maxn];
int INV(int x){return x==1?1:1ll*(mod-mod/x)*INV(mod%x)%mod;}
inline int C(int n,int m){
return 1ll*fac[n]*inv[m]%mod*inv[n-m]%mod;
}
inline int f(int n,int m,int k){
if(k>n||k>m)return 0;
return 1ll*C(n,k)*C(m,k)%mod*fac[k]%mod;
}
int main(){
int a=read(),b=read(),c=read(),d=read(),k=read(),tp=max(b,max(a+c,d)),ans=0;
for(register int i=1;i<=tp;++i)fac[i]=1ll*fac[i-1]*i%mod;
inv[tp]=INV(fac[tp]);
for(register int i=tp-1;~i;--i)inv[i]=1ll*inv[i+1]*(i+1)%mod;
for(register int i=0;i<=k;++i)(ans+=1ll*f(a,b,i)*f(a+c-i,d,k-i)%mod)%=mod;
printf("%d\n",ans);
}