显然的特判 如果n+m<k 或者k=1 输出肯定是0
否则呢? 先按照ababab顺序,填充满k个,那么容易得到a和b剩余的个数分别为n-(k+1)/2、m-k/2
对于a来说,也就是在(k+1)/2个已经放好的a内,在放剩下的n-(k+1)/2,允许放的个数为0.
那这不就是隔板法吗,所以方案数就是
同理容易得到b的方案数
注意下、前面规定的放置顺序是ababab
那么我们也可以按照babababa顺序放置。。方法和上述一样也是分别进行隔板法然后相乘。
然后把两种的方案数相加即可。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll mod=1e9+7; ll f[100005]; ll qpow(ll a,ll b){ ll ans=1; while(b){ if(b&1) ans=ans*a%mod; b>>=1; a=a*a%mod; } return ans; } int main(){ ll n,m,k;cin>>n>>m>>k; if(n+m<k || k==1) cout<<0; else{ f[0]=1; for(int i=1;i<=100000;i++) f[i]=f[i-1]*i%mod; ll ans=0; //ababa... if(n>=k/2+k%2 && m>=k/2) ans=f[n-1]*qpow(f[k/2+k%2-1]*f[n-k/2-k%2]%mod,mod-2)%mod*(f[m-1]*qpow(f[k/2-1]*f[m-k/2]%mod,mod-2)%mod); //bababab... if(m>=k/2+k%2 && n>=k/2) ans+=f[m-1]*qpow(f[k/2+k%2-1]*f[m-k/2-k%2]%mod,mod-2)%mod*(f[n-1]*qpow(f[k/2-1]*f[n-k/2]%mod,mod-2)%mod); cout<<ans%mod; } return 0; }