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 学长的介绍 第一部分 一般情况下,我们计算大组合数取模问题是用递推公式 ...
随机推荐
- mapper mysl实现批量插入 更新
1.批量插入 <insert id="insertConfirm" parameterType="java.util.List"> insert i ...
- ubuntu系统在安装好mysql后,出现ERROR 2002(HY000: Can't to local MySQL server through socket '/var/run/mysqld/mysqld.sock')(2)(图文详解)
不多说,直接上干货! 问题详情 我在写此博客之前,看了网上各种资料,写的太冗余和繁琐杂乱.最简单的解决方法莫过于我这篇博客.直接如下. 这是liux套接字网络的特性,win平台不会有这个问题. 解决方 ...
- storm中KafkaSpout的选择
Storm最常用的消息源就是Kafka,在对接的时候大多需要使用KafkaSpout: 在网上大概有两种KafkaSpout,一种是只有几十行,一种却有一大啪啦类文件. 在kafka中,同一个part ...
- Linux定时任务与开机自启动脚本(cron与crontab)
开机自启动脚本 网上常见的脚本开机自启方法是: 假设要自启的脚本位于 /home/user/test.sh 给脚本可执行的权限 sudo chmod +x /home/user/test.sh 将脚本 ...
- 诠释JavaScript中的this
文章首发:http://www.cnblogs.com/sprying/p/3573456.html 使用this的几种场合 1. 执行函数时,判断函数是对象方法还是一个单独的函数?单独的函数this ...
- SpringSecurity 3.2入门(7)自定义权限控制介绍
总结Spring Security的使用方法有如下几种: 一种是全部利用配置文件,将用户.权限.资源(url)硬编码在xml文件中. 二种是用户和权限用数据库存储,而资源(url)和权限的对应关系硬编 ...
- 02.List泛型集合
List泛型可以转换成数组 List泛型和数组的相同点: List泛型的数据类型必须是指定的,数组的数据类型也必须是指定的. List泛型和数组的不同点: List泛型的长度是随意的,而数组的长度必须 ...
- 1229:密码截获----java
题目描述 Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码 进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解.比 ...
- python私有成员
在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用.在Python中,是通过_前缀来实现的. 正常的函数和变量名是公开的(publ ...
- 1.浅析Hadoop之HDFS
HDFS ,Hadoop Distribute File System,hadoop分布式文件系统. 主从架构,分主节点NameNode,从节点DataNode.当然还有个SecondaryName, ...