Lucas 大组合数
题目:HDU 3037
题意:有n个树,m个坚果,放到n个树里,可以不放完,有多少种方法。
分析:

得到组合数了。
大组合数什么费马小定理,Lucas定理都来了;
总的说,不能用二维地推了,用的却是组合数的定义。

一般来说大组合通常要取模。
那么不能边乘边模,边除边模,等式不会成立。
根据逆元,除以一个数取模 = 乘以这个数对mod的逆元。
那么式子就可以写成:
这里,我们可以预处理所有 i 对 mod 的逆元后,累乘,这样得到的就是阶乘的逆元。
然后就是求 i 对 mod 的逆元了,什么扩展欧几里得就来了。
当然,有费马小定理。
inv[i] = (mod-mod/i)*inv[mod%i]%mod;
整个求大组合数就是这样出来了。
void init() {
fac[] = ;
for(int i=;i<maxn;i++)
fac[i] = i*fac[i-]%mod;
inv[] = inv[] = ;
for(int i=;i<maxn;i++)
inv[i] = (ll)(mod-mod/i)*inv[mod%i]%mod;
for(int i=;i<maxn;i++)
inv[i] = inv[i-]*inv[i]%mod;
}
ll C(ll n,ll m) {
if(n<m)
return ;
return fac[n]*inv[m]%mod*inv[n-m]%mod;
}
但是这个题目n,m的范围惊人1000000000,作为阶乘,逆元,数组开不下。
Lucas来了:

看结果吧:

还是有组合数,用了费马定理:
fac[n]*Inv(fac[m])%P*Inv(fac[n-m])%P;
因为这里的对P的逆元 Inv已经不能用数组表示和地推了,Inv()函数,利用了费马定理,快速幂等等,原理很复杂了,哈哈~~~,我就不证明了。
void initFac(int n) {
fac[] = ;
for(int i=;i<=n;i++)
fac[i] = i*fac[i-]%P;
}
ll Pow(ll a,int b) {
ll re = ;
for(;b;b>>=,a=a*a%P)
if(b&) re = re*a%P;
return re;
}
ll Inv(ll a) {
return Pow(a,P-);
}
ll C(ll n,ll m) {
if(n<m) return ;
return fac[n]*Inv(fac[m])%P*Inv(fac[n-m])%P;
}
ll Lucas(ll n,ll m) {
if(n<m) return ;
ll re = ;
for(;m;n/=P,m/=P)
re = re*C(n%P,m%P)%P;
return re;
}
Lucas 大组合数的更多相关文章
- 大组合数取模之lucas定理模板,1<=n<=m<=1e9,1<p<=1e6,p必须为素数
typedef long long ll; /********************************** 大组合数取模之lucas定理模板,1<=n<=m<=1e9,1&l ...
- lucas定理解决大组合数取模
LL MyPow(LL a, LL b) { LL ret = ; while (b) { ) ret = ret * a % MOD; a = a * a % MOD; b >>= ; ...
- 大组合数:Lucas定理
最近碰到一题,问你求mod (p1*p2*p3*……*pl) ,其中n和m数据范围是1~1e18 , l ≤10 , pi ≤ 1e5为不同的质数,并保证M=p1*p2*p3*……*pl ≤ 1e18 ...
- 大组合数Lucas
https://blog.csdn.net/sr_19930829/article/details/39058487 LL Lucas(LL n, LL m, int p){ ; } Saving B ...
- HDU 5698 大组合数取模(逆元)
瞬间移动 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- poj1942 Paths on a Grid(无mod大组合数)
poj1942 Paths on a Grid 题意:给定一个长m高n$(n,m \in unsigned 32-bit)$的矩形,问有几种走法.$n=m=0$时终止. 显然的$C(m+n,n)$ 但 ...
- lightoj 1226 - One Unit Machine(dp+大组合数去摸)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1226 题解:由于这些任务完成是有先后的所以最后一个完成的肯定是最后一个任务的子 ...
- 求大组合数mod p,(p不一定为质数)
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define N 2000005 ll p; ll ...
- 【算法学习笔记】组合数与 Lucas 定理
卢卡斯定理是一个与组合数有关的数论定理,在算法竞赛中用于求组合数对某质数的模. 第一部分是博主的个人理解,第二部分为 Pecco 学长的介绍 第一部分 一般情况下,我们计算大组合数取模问题是用递推公式 ...
随机推荐
- TT 安装 之 LINUX
# useradd ttadmin -- 创建用户 # groupadd ttadmin -- 创建用户组 # mkdir /etc/TimesTen -- 创建目录 # chgrp -R ttadm ...
- spring IoC源码分析 (3)Resource解析
引自 spring IoC源码分析 (3)Resource解析 定义好了Resource之后,看到XmlFactoryBean的构造函数 public XmlBeanFactory(Resource ...
- quartz使用(整合spring)
quartz与spring整合后,还是需要Scheduler实例.JobDetail实例.Trigger实例,只不过是用FactoryBean的方式创建了. 在spring-context-suppo ...
- Linux——【rpm、yun、源码包】安装
RPM包或者安装源码包 在windows下安装一个软件很轻松,只要双击.exe的文件,安装提示连续“下一步”即可,然而linux系统下安装一个软件似乎并不那么轻松,因为我们不是在图形界面下.所以我们要 ...
- opensuse13.1 安装 SqliteMan
Sqliteman是一个图形界面的sqliteman客户端 官网 http://www.sqliteman.com/ 1 添加源 http://download.opensuse.org/repos ...
- elasticsearch清空type下的所有数据
DELETE /twitter/tweet/_query{"query": { "match_all": {} }} 注:twitter为index,tweet ...
- js 用简单案例举模态对话框弹出
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 第七章--Java基础类库--与用户的互动
1.命令行编译和运行java程序在notepad++中集成java编译运行命令 参考博客:http://blog.sina.com.cn/s/blog_84405af50101q7fn.html2与用 ...
- windows下快速修改host文件
windows下快速修改host文件 win+r 输入 notepad c:\Windows\System32\drivers\etc\hosts
- caffe-windows之网络描述文件和参数配置文件注释(mnist例程)
caffe-windows之网络描述文件和参数配置文件注释(mnist例程) lenet_solver.prototxt:在训练和测试时涉及到一些参数配置,训练超参数文件 <-----lenet ...