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 学长的介绍 第一部分 一般情况下,我们计算大组合数取模问题是用递推公式 ...
随机推荐
- java se系列(一)开发前奏
1. 软硬件知识 电子计算机:俗称电脑,是一种能够按照程序运行,自动.高速处理海量数据的现代化智能电子设备.由硬件和软件所组成,没有安装任何软件的计算机称为裸机 cpu:是一台计算机的运算核心和控制核 ...
- ubuntu下安装vue-cli框架
首先安装好node.js,安装方式见 http://www.cnblogs.com/teersky/p/7255334.html 之后正式开始vue-cli之旅吧,输入以下代码安装vue-cli模块 ...
- python_学生信息管理实例
"""提示:代码中的内容均被注释,请参考,切勿照搬""" """注意:代码切勿照搬,错误请留言指出" ...
- DNS服务器设置
1,域名解析:ip能够访问,但是域名不能访问. 2,配置好网络之后,切换到命令行模式,配置好的网络便不能用了. 具体方法: 打开vim /etc/sysconfig/network-scripts/i ...
- unity监听键盘按键
放在Update里面 if (Input.anyKeyDown) { foreach (KeyCode keyCode in Enum.GetValues(typeof(KeyCode))) { if ...
- VHDL
数字逻辑VHDL 信号与变量 signal是全局的,在整个结构体中都有效,它的赋值是在进程结束, 也就是最后的赋值是有效的. variable是局部的,它的赋值是立即生效的. 一般变量是在进程的说明部 ...
- rpm重装python和yum
前些天升级的python, yum就不能用了, 提示 "No module named yum", 然后搜索了一下, 说要重装python和yum, 也没多想, 就按照那些教程去做 ...
- Java学习第二十四天
1:多线程(理解) (1)JDK5以后的针对线程的锁定操作和释放操作 Lock锁 (2)死锁问题的描述和代码体现 (3)生产者和消费者多线程体现(线程间通信问题) 以学生作为资源来实现的 资源类:St ...
- 从数据库中导出数据到.csv文件
考虑到csv文件比xls文件格式容易控制,所以在这次导出中用的是.csv格式. protected function exportInfo($arr, &$err){ $nameInfo = ...
- Excle 导入DataSet
using System.Data.OleDb;using System.Data; public void ReadExcelFiless() { //strin ...