首先枚举有几天是不好的天,然后用插板法计算时间的安排方式。答案是
∑i=max(1,n−w)min(n−2,b)(n−i−1)(w−1n−i−1)(b−1i−1)b!w!
#include<cstdio>
#include<algorithm>
using namespace std;
#define LL long long
const int p=1000000009,maxn=4010;
int cw[maxn],cb[maxn],inv[maxn],prm[maxn],tot,n,m,w,b;
int pow(int x,int k)
{
int ret=1;
for (;k;k>>=1,x=(LL)x*x%p)
if (k&1) ret=(LL)ret*x%p;
return ret;
}
int main()
{
int ans=0;
scanf("%d%d%d",&n,&w,&b);
m=max(w,b);
inv[1]=1;
for (int i=2;i<=m;i++)
{
if (!inv[i])
{
inv[i]=pow(i,p-2);
prm[++tot]=i;
}
for (int j=1;i*prm[j]<=m;j++)
{
inv[i*prm[j]]=(LL)inv[i]*inv[prm[j]]%p;
if (i%prm[j]==0) break;
}
}
cw[0]=1;
for (int i=1;i<w;i++) cw[i]=(LL)cw[i-1]*inv[i]%p*(w-i)%p;
cb[0]=1;
for (int i=1;i<b;i++) cb[i]=(LL)cb[i-1]*inv[i]%p*(b-i)%p;
for (int i=max(1,n-w);i<=n-2&&i<=b;i++)
ans=(ans+(LL)(n-i-1)*cw[n-i-1]%p*cb[i-1])%p;
for (int i=2;i<=b;i++) ans=(LL)ans*i%p;
for (int i=2;i<=w;i++) ans=(LL)ans*i%p;
printf("%d\n",ans);
}