迷之盒子 - 带上界的隔板法

题目链接:迷之盒子


显然就是隔板之后,每个盒子个数要小于等于k。

我们可以利用容斥来做。

至少有0堆(k+1)的 - 至少有1堆(k+1)的 + 至少有2堆(k+1)的。。。。。。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include
#define int long long
using namespace std;
const int N=5e5+10,mod=1e9+7;
int n,m,k,f[N],inv[N],res;
int qmi(int a,int b){int res=1;for(;b;b>>=1LL,a=a*a%mod)	if(b&1LL)	res=res*a%mod;return res;	
}
inline int C(int n,int m){if(m>n)	return 0;return f[n]*inv[m]%mod*inv[n-m]%mod;
}
signed main(){f[0]=inv[0]=1;for(int i=1;i<=5e5;i++)	f[i]=f[i-1]*i%mod;inv[500000]=qmi(f[500000],mod-2);for(int i=5e5-1;i>=1;i--)	inv[i]=inv[i+1]*(i+1)%mod;cin>>n>>m>>k;for(int i=0;i<=m;i++){if(n+m-i*(k+1)-1<=0)	break;if(i&1)	res=(res-C(n,i)*C(n+m-i*(k+1)-1,n-1)%mod+mod)%mod;else	res=(res+C(n,i)*C(n+m-i*(k+1)-1,n-1)%mod)%mod;}cout<<res;return 0;
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部