P1680 奇怪的分组(组合数+逆元)
2024-10-07 21:32:17
首先将n减去所有的Ci,于是是原问题转换为:n个相同的球放入m个不同盒子里,不能为空,求方案数.
根据插空法:n个球,放到m个箱子里去不能为空,也就是有m-1块板子放在n-1个空隙之间
那么组合数求解也就是C(n-1,m-1)
除法求余有误差所以先求分母的逆元,转化为分子*逆元%mod的形式
在模为素数p的情况下,有费马小定理
a^(p-1)=1(mod p)
那么a^(p-2)=a^-1(mod p)
也就是说a的逆元为a^(p-2)
那么快速幂一下求逆元就好了。
#include <bits/stdc++.h>
using namespace std;
const int mod=1000000007;
const int maxn=1000009;
typedef long long ll;
int n,m;
ll fc[maxn+10];
ll quickpow(ll a,ll n)
{
ll ans=1;
while(n)
{
if(n&1) ans=ans*a%mod;
a=a*a%mod;
n>>=1;
}
return ans;
}
ll C(int n,int k)
{
ll fm=fc[k]*fc[n-k]%mod;//求b的逆元
//因为a/b%mod,除法取模会出现问题,所以要求逆元
return fc[n]*quickpow(fm,mod-2)%mod;
}
int main()
{
fc[0]=1;
for(int i=1;i<=maxn;i++)
fc[i]=fc[i-1]*i%mod;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
ll l;cin>>l;
n-=l;
}
//n个苹果,放到m个箱子里去不能为空
//也就是有m-1块板子放在n-1个空隙之间
cout<<C(n-1,m-1);
}
最新文章
- 介绍几个好用的vs插件
- BZOJ2809: [Apio2012]dispatching
- Android开发 代替 “(XXXX)findViewById()”
- Android应用开发SharedPreferences存储数据的使用方法
- 转载:Solr的自动完成实现方式(第三部分:Suggester方式续)
- 重启nginx
- 淘宝(阿里百川)手机客户端开发日记第十五篇 JSON解析(四)
- java 16 -11 ArrayList存储自定义对象并增强for遍历
- windows 查 mac
- USACO 2017 February Gold
- vue版 弹幕
- java包名命名规范[【转】
- avr定时器做的正弦波
- FileReader.FileWriter 执行文本复制
- Android友盟增量更新
- CGI servlet Applet Scriptlet Scriptlet JSP data layer(数据层),business layer(业务层), presentation layer(表现层)
- SVN概述
- css3效果隔两秒旋转然后停两秒再继续旋转,无限循环
- 剑指offer五十七之二叉树的下一个结点
- 【分布式消息队列-MQ】
热门文章
- [leetcode]1379. Find a Corresponding Node of a Binary Tree in a Clone of That Tree
- 多级菜单初写(dict使用)
- Odoo 查看 模块app 对应的 源码 相关依赖模块信息
- AJ学IOS 之BLOCK的妙用_利用block实现链式编程
- Spring Cloud 系列之 Gateway 服务网关(一)
- Python-selenium安装与Java-selenium安装
- 解决vue element table行列不齐问题
- CTFHub web技能树 RCE
- Chrome 浏览器安装 ChroPath 插件
- [HTML] <;base>;链接默认打开方式标签元素