当前位置: 首页 > news >正文

【题解】分特产(组合数+容斥)

【题解】分特产(组合数+容斥)

一道小水题。

假如没有这个要求每个人都要有一个特产的限制我们直接可以组合数。

我们又发现人(本质上)是没有区别的,所以容斥的复杂度只有\(O(n)\)

\(n\)个人分\(m\)个特产,每个特产有\(a_i\)个,人可以不拿特产,的方案数就是把\(a_i\)分成\(n\)份,而且可以分为\(0\)份。

这个的答案就是
\[ f(n)=\prod_{i=1}^m {a_i+n-1\choose n-1} \]
意思就是有\(a_i+n\)个球分成不为空\(n\)份的方案,新建\(n\)个球,选了这\(n\)个球代表你不选。

于是我们就可以容斥出来我们要的答案。
\[ \sum_{i=0}^{n-1} (-1)^if(n-i) \]
哦要解释一下这个式子的意思,\(f(x)\)里面的方案数包括了所有大于\(x>\)它的的方案数。我们才要容斥。

所以枚举钦定至少\(i\)个人一个也没有,最终我们要的是0个人一个也没有。

//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long

using namespace std;  typedef long long ll;
inline int qr(){
      register int ret=0,f=0;
      register char c=getchar();
      while(c<48||c>57)f|=c==45,c=getchar();
      while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
      return f?-ret:ret;
}
const int mod=1e9+7;
const int maxn=2e3+5;
int jc[maxn];
int inv[maxn];
int data[maxn];
inline int Pow(int base,const int&p){
      register int ret=1;
      for(register int t=p;t;t>>=1,base=1ll*base*base%mod)
        if(t&1)ret=1ll*ret*base%mod;
      return ret;      
}

inline int c(const int&n,const int&m){
      if(n<m||m<0)return 0;
      return 1ll*jc[n]*inv[m]%mod*1ll*inv[n-m]%mod;
}

signed main(){

      jc[0]=inv[0]=1;
      for(register int t=1;t<maxn;++t)
        jc[t]=1ll*jc[t-1]*t%mod,inv[t]=Pow(jc[t],mod-2);
      int n=qr(),m=qr();
      for(register int t=1;t<=m;++t)
        data[t]=qr();
      int ans=0;
      for(register int t=0,delta;t<n;++t){
        delta=c(n,t);
        for(register int i=1;i<=m;++i)
          delta=1ll*delta*c(data[i]+n-t-1,n-t-1)%mod;
        if(t&1)delta=mod-delta;
        ans=(ans+delta)%mod;
      }
      cout<<ans<<endl;      
      return 0;
}

转载于:https://www.cnblogs.com/winlere/p/11017582.html

相关文章:

  • rabbitma客户端
  • CloudSim
  • 新入职感觉
  • 迭代(二):迭代法求方程的根
  • MySQL数据库可以用任意ip连接访问的方法
  • 网络编程实战之FTP的文件断点续传
  • C语言核心技术第一章
  • PHP Curl 请求同域的问题
  • 实验十
  • Python内置函数
  • CSS3属性—— line-clamp控制文本行数
  • 浏览器常用快捷键
  • 脾气
  • vue常用的修饰符
  • 为 Linux 应用程序编写 DLL
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 30秒的PHP代码片段(1)数组 - Array
  • Angular6错误 Service: No provider for Renderer2
  • canvas 绘制双线技巧
  • echarts花样作死的坑
  • Git初体验
  • Javascript基础之Array数组API
  • Java知识点总结(JavaIO-打印流)
  • leetcode386. Lexicographical Numbers
  • 后端_ThinkPHP5
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 那些年我们用过的显示性能指标
  • 前端知识点整理(待续)
  • 嵌入式文件系统
  • 一天一个设计模式之JS实现——适配器模式
  • 原生js练习题---第五课
  • 自定义函数
  • ​linux启动进程的方式
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #每天一道面试题# 什么是MySQL的回表查询
  • #微信小程序(布局、渲染层基础知识)
  • ()、[]、{}、(())、[[]]命令替换
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (七)理解angular中的module和injector,即依赖注入
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (算法)求1到1亿间的质数或素数
  • (算法二)滑动窗口
  • .bat批处理(六):替换字符串中匹配的子串
  • .java 9 找不到符号_java找不到符号
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET Core 版本不支持的问题
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET大文件上传知识整理
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .Net中间语言BeforeFieldInit
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • ??eclipse的安装配置问题!??
  • @Autowired自动装配