Devu 有 n 个花瓶,第 ii 个花瓶里有 fi 朵花。他现在要选择 s 朵花。
你需要求出有多少种方案。两种方案不同当且仅当两种方案中至少有一个花瓶选择花的数量不同
可重复集的组合数 Ce( n,m) = C(m-1,m+n-1 )
namo用容斥原理

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int M = 1<<20 ,mod=1e9+7; #define int long long #define ll long long int a[25],f[M]; int fac[22]; int k; ll r,n[25],inv[25]; ll pow (ll a,ll b,ll p){ ll ans=1; while (b){ if (b%2) ans=(ans*a)%p; b/=2; a=(a*a)%p; } return ans; } void get_inv(ll n,ll p){ inv[1]=1; for (ll i=2;i<=n;i++){ inv[i]=inv[p%i]*(p-p/i)%p; } } int C(ll y,ll x){ if (y<0||x<0||y<x) return 0; y%=mod; if (y==0 || x==0) return 1; ll ans=1; for ( int i=0;i<x;i++){ ans=1ll*ans*(y-i)%mod; } for ( int i=1;i<=x;i++){ ans=1ll*ans*inv[i]%mod; } return ans; } signed main() { int n,m; get_inv(20,mod); cin>>m>>n; fac[0]=1; for ( int i=1;i<20;i++) fac[i]=fac[i-1]*i ; for ( int i=1;i<=m;i++) cin>>a[i]; int ans=C(m+n-1,m-1); for ( int j=1;j<(1<<m);j++){ int t=m+n, cnt=0; for ( int i=0;i<m;i++){ if ((j>>i)&1) cnt++, t-=a[i+1]; // } t-=cnt+1; if (cnt&1) ans=(ans-C(t,m-1))%mod ; else ans=ans+C(t,m-1)%mod ; } cout<<(ans+mod)%mod; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!