组合数

公式:

组合数取模问题

你可能第一感觉觉得组合数取模应该不难,不就是取个模嘛,
分子是n的阶乘,分母是 n!*(n-m)! 需要注意的就是, 分子分母都挺大的,容易爆范围,那么我们算阶乘的时候每一步都取模,这样就不会爆了。嘿嘿,轻松搞定!
但是,实际他的难点在后边,因为组合数的计算中牵扯到了除法运算。
注意:除法运算对自然数不具有封闭性,所以除法直接取模会出错。
什么意思呢? 举个栗子!
[(10*10)/(5*5)]%4= (100/25)%4=4%4=0 这是对的吧
然而每一步取模的话就是 (10%4) *(10%4)/(5%4)*(5%4)=2*2/1*1=2 就错了
这就是除法的不封闭性
那么,怎么半呢?既然除法取模不行,那我们把除法转化成乘法不就好了,乘法是封闭的
怎么转化呢?乘法逆元!
关于乘法逆元的用法以及如何求,写在这里
用费马小定理和扩展gcd都可以求逆元,下面写下扩展gcd的写法

ll exgcd(ll a,ll b,ll &x,ll &y){if(b==0){x=1;y=0;return a;}ll r=exgcd(b,a%b,x,y);ll t=y;y=x-(a/b)*y;x=t;return r;
}
ll c(ll n,ll m){if(n<m)return 0;ll fz=1,fm=1;//求出分子 n!for(ll i=n;i>=1;i--){fz*=i;fz%=mod;}//求出分母 m!*(n-m)!for(ll i=m;i>=1;i--){fm*=i;fm%=mod;}for(ll i=n-m;i>=1;i--){fm*=i;fm%=mod;}//求出分母的逆元 xll x,y,ans;exgcd(fm,mod,x,y);x=(x+mod)%mod;//做乘法ans=x*fz%mod;return ans;
}

到这里,我们组合数取模的问题就解决了吗?别急,卢卡斯定理还没说呢。

卢卡斯定理

转化成逆元求乘法确实解决了除法取模的问题,但是,如果我给你的n和m都特别大呢。
比如(n<1e18,m<1e18)这样光是算阶乘就已经超时了
这个时候就用到了卢卡斯定理
很简单,一句话 卢卡斯定理:
C(n, m) % p = C(n / p, m / p) * C(n%p, m%p) % p

对于C(n / p, m / p),如果n / p 还是很大,就一直递归下去,直到m/p为0了

ll Lucas(ll n, ll m,ll mod){return m ? Lucas(n/mod, m/mod) * c(n%mod, m%mod) % mod : 1;//结合上用逆元求组合数的代码
}

定理的证明:

管他咋证明的,反正就是对的。(窝不会~)

模板题

P3807 【模板】卢卡斯定理

#include<iostream>
#include<stdio.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+7;
ll f[maxn];
ll exgcd(ll a,ll b,ll &x,ll &y){if(b==0){x=1;y=0;return a;}ll r=exgcd(b,a%b,x,y);ll t=y;y=x-(a/b)*y;x=t;return r;
}
ll c(ll n,ll m,ll mod){if(n<m)return 0;ll fz,fm;fz=f[n];//分子fm=f[n-m]*f[m]%mod;//分母ll x,y,ans;exgcd(fm,mod,x,y);x=(x+mod)%mod;//逆元ans=x*fz%mod;return ans;
}
ll Lucas(ll n,ll m,ll mod){return m ? Lucas(n/mod, m/mod,mod) * c(n%mod, m%mod,mod) % mod : 1;
}
int main(){ll T,n,m,p;cin>>T;while(T--){cin>>n>>m>>p;f[0]=1;for(ll i=1;i<=p;i++)f[i]=i*f[i-1]%p;//预处理阶乘cout<<Lucas(n+m,m,p)<<endl;}
}

Lucas(卢卡斯)定理---组合数取模问题相关推荐

  1. 2015 ICL, Finals, Div. 1 Ceizenpok’s formula(组合数取模,扩展lucas定理)

    J. Ceizenpok's formula time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  2. 组合数学 —— 组合数取模

    [概述] 组合数取模,即计算组合数 ,由于 ,同余定理对除法不适用,因此需要使用别的方法来解决这个问题 常见的方法有:使用逆元对组合数取模.递推打表取模.卢卡斯定理.扩展卢卡斯定理等,这些方法应用的场 ...

  3. Codeforces 869C The Intriguing Obsession 组合数取模

    Codeforces 869C The Intriguing Obsession 思考一下人生. 这是一场物语场,而且A题直接puts("Karen")能过,我对此印象非常深.我不 ...

  4. 组合数学 —— 组合数取模 —— 卢卡斯定理与扩展卢卡斯定理

    [卢卡斯定理] 1.要求:p 是质数,m.n 很大但 p 很小 或者 n.m 不大但大于 p 2.定理内容 其中, 3.推论 当将 n 写成 p 进制:,将 m 写成 p 进制: 时,有: 4.实现 ...

  5. 组合数取模 Lucas定理

    对于C(n, m) mod p.这里的n,m,p(p为素数)都很大的情况.就不能再用C(n, m) = C(n - 1,m) + C(n - 1, m - 1)的公式递推了. 这里用到Lusac定理 ...

  6. 组合数取模 - Lucas/exLucas - LibreOJ #181. 二项式系数

    文章目录 Lucas定理 证明 拓展问题 一些优化(LibreOJ #181. 二项式系数) 预处理部分 复杂度分析 大佬的玄学优化(取模) AC代码 证明和代码分开,可以根据自己的需要跳转. 去我的 ...

  7. bzoj1951 组合数取模 中国剩余定理

    #include<bits/stdc++.h> using namespace std; typedef long long ll; const int a[4]={2,3,4679,35 ...

  8. 教你一波Lucas(卢卡斯)定理在数论解题中的应用

    首先,Lucas(卢卡斯)定理是什么?有什么用? Lucas定理是用来求 C(n,m) mod p,p为素数的值.(注意:p一定是素数) 有人会想,C(n,m)不能用C(n, m) = C(n - 1 ...

  9. 大数组合数取模(逆元+打表)

    将阶乘O(n)打表之后C(n,m)便可O(1)求出,除法取模用逆元解决 hdu5698瞬间移动 #include<bits/stdc++.h> using namespace std; c ...

  10. Lucas定理及组合数取模

    首先给出这个Lucas定理: A.B是非负整数,p是质数.AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]. 则组合数C(A,B)与C(a[n],b[n] ...

最新文章

  1. 巧用FTP命令进行文件传输
  2. [项目实施失败讨论Case] “凭心而论,在这家公司很敬业的工作了3年多,老板最后给我下的评语,大家都看看吧,千万别和我走同一条路!”(摘自csdn)...
  3. 计算机视觉与深度学习 | 动态背景下的前景目标提取
  4. Boost:基于Boost的阻塞TCP回显服务器
  5. boost Mutex
  6. java 几个线程池的理解
  7. java jpa jar_JPA 开发所需的Jar包 (基于Hibernate)
  8. python requests form data_Python爬虫:Request Payload和Form Data的简单区别说明
  9. 算法 - 反转字符串
  10. mysql 查询排序位置_MySQL-基础查询与排序
  11. 想要构建现代化数据中心?交给戴尔第14代PowerEdge服务器解决吧!
  12. 15个使用 CSS3 制作的漂亮作品展示网站
  13. Linux第二周学习笔记(12)
  14. 用matlab画x 的定积分图像,matlab图像定积分
  15. java基于springboot+vue学生考勤签到请假管理系统84y43
  16. 方舟原始恐惧mod生物代码_方舟:生存进化新手攻略
  17. 黑盒测试 白盒测试
  18. 绿盟科技实习安服面经
  19. 07 给Form视图添加Chatter(学Odoo,就得Do)
  20. SAP ST05 追踪找表法

热门文章

  1. Dedecms文件夹目录解释完整版
  2. 翻译Programming WCF Services第二版
  3. net2.0如何修改用户密码的解决
  4. http 请求中的 referer
  5. java Hashtable 和 HashiMap 的区别
  6. Case:update中把in改写成join性能提高数倍
  7. PHP中cookies跨目录无法调用解决办法
  8. 新版ubuntu16.04安装旧版商店与flash
  9. [推荐]一个 1kb 的image placeholder的js库
  10. MongoDB副本集学习(三):性能和优化相关