容斥原理解一般不定方程——cf451E经典题
2024-08-22 21:50:58
/*
给定n个盒子,第i个盒子有ai朵花,现在从中选取m朵花,问选取方案数
用容斥定理解决 m=x1+x2+..+xn
C(m+n-1,n-1)+sum{ (-1)^p * C(m+n-1-(1+n1)-(1+np),n-1) }
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
ll ans,n,s,A[],inv[]; ll Pow(ll a,ll b){
ll res=;
while(b){
if(b%)
res=res*a%mod;
b>>=;a=a*a%mod;
}
return res;
}
ll C(ll y,ll x){
if(y<||x<||y<x)return ;
y%=mod;
if(y==|| x==)return ;
ll ans=;
for(ll i=;i<x;i++)
ans=(ll)ans*(y-i)%mod;
for(ll i=;i<=x;i++)
ans=ans*inv[i]%mod;
return ans;
} int main(){
cin>>n>>s;
for(ll i=;i<=;i++)
inv[i]=Pow(i,mod-); for(int i=;i<n;i++)cin>>A[i]; for(ll i=;i<(<<n);i++){
ll a=n-,b=s+n-,tmp=;
if(i==){
ans=(ans+C(b,a))%mod;
continue;
}
for(int j=;j<n;j++)
if(i & ((ll)<<j)){
tmp++;
b-=A[j]+;
}
if(tmp%){//减法
ans=(ans-C(b,a))%mod;
ans=(ans+mod)%mod;
}
else {
ans=(ans+C(b,a))%mod;
}
}
cout<<ans<<'\n';
}
最新文章
- Java集合---ConcurrentHashMap原理分析
- 终于完成了Josephus的C语言实现啦~~
- js获取随机色
- C++虚函数的缺陷
- ANDROID_MARS学习笔记_S03_004_getAllProviders、LOCATIONLISTENER、getBestProvider
- python urllib2模块携带cookie
- HDOJ(HDU) 2503 a/b + c/d(最大公约数问题)
- mysql5.5.17源代码安装
- Sql server not in优化
- 深入理解C++11【3】
- mpdf-html转PDF,中文字符乱码、加粗问题
- 【转】Mac OS X 上修改主机名
- redis调优的实战经验
- Tomcat8.5配置https启动报空指针错误
- 在Centos 6 64bit 上安装 Hyperic HQ 5.8.2.1 中文版
- ModuleNotFoundError: No module named &#39;_pydevd_bundle.pydevd_cython&#39; error on debug
- Spring源码解析二:IOC容器初始化过程详解
- 如何查看Isilon的节点的CPU的信息?
- C#学习笔记之(Hellow,WORLD;常量和变量;键盘输入和输出;数据类型转换;计算器)
- webpack+vuecli打包常见的2个坑