[洛谷P4720] [模板] 扩展卢卡斯
求组合数的时候,如果模数p是质数,可以用卢卡斯定理解决。
但是卢卡斯定理仅仅适用于p是质数的情况。
当p不是质数的时候,我们就需要用扩展卢卡斯求解。
实际上,扩展卢卡斯=快速幂+快速乘+exgcd求逆元+质因数分解+crt合并答案+求阶乘,跟卢卡斯定理没什么关系......
如果把模数p分解成p1^k1*p2^k2*...*px^kx的形式,那么我们可以求出c(n,m)分别模每个pi^ki的结果,再用中国剩余定理合并即可。
每个pi^ki一定是互质的,所以用朴素crt就行。
根据组合数的定义,c(n,m)=(n!) / (m!*(n-m)!) ,所以我们只要能想办法求出阶乘,就能再利用exgcd求出逆元,进而求出组合数。
接下来唯一的问题就是怎么快速求出 x! 取模 pi^ki 的结果。
考虑如下的经典样例(据说来自popoqqq):(19!)%(3^2)
19!=1*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19
先把其中的3的倍数提出来,因为求组合数的时候分子分母能约掉。
19!=(1*2*4*5*7*8)*(10*11*13*14*16*17)*(19)*(3*6*9*12*15*18)=(1*2*4*5*7*8)*(1*2*4*5*7*8)*(3*3*3*3*3*3)*(1*2*3*4*5*6)=(1*2*4*5*7*8)^2*19*(3^6)*(1*2*3*4*5*6)。
后面的6!部分可以递归求解,递归终点为0!=1。
3^6最后计算组合数的时候再处理。
那几个(1*2*4*5*7*8)显然是循环的,循环节长度小于pi^ki,可以暴力计算。
显然一共有(x/(pi^ki))个循环节,套个快速幂即可。
剩下的部分,即19,长度等于x%(pi^ki),也小于pi^ki,也可以暴力计算。
至此我们求出了阶乘。
求组合数的时候,考虑pi的倍数的影响。
分子分母分别计数相加减。
最后用crt合并即可。
#include<cstdio>
typedef long long ll; ll n,m,p; ll ksm(ll b,ll tp,ll mod)
{
ll ret=;
while(tp)
{
if(tp&)ret=ret*b%mod;
b=b*b%mod;
tp>>=;
}
return ret;
} ll mul(ll a,ll b,ll mod)
{
ll ret=;
while(b)
{
if(b&)ret=(ret+a)%mod;
a=(a+a)%mod;
b>>=;
}
return ret;
} ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b)
{
x=;y=;
return a;
}
ll t=exgcd(b,a%b,y,x);
y-=a/b*x;
} ll inv(ll x,ll mod)
{
ll a,b;
exgcd(x,mod,a,b);
return (a%mod+mod)%mod;
} ll fac(ll x,ll pi,ll pk)
{
if(!x)return ;
ll ans=;
for(ll i=;i<=pk;i++)
if(i%pi)ans=ans*i%pk;
ans=ksm(ans,x/pk,pk);
for(ll i=;i<=x%pk;i++)
if(i%pi)ans=ans*i%pk;
return ans*fac(x/pi,pi,pk)%pk;
} ll c(ll cn,ll cm,ll pi,ll pk)
{
if(cm>cn)return ;
ll up=fac(cn,pi,pk),d1=fac(cm,pi,pk),d2=fac(cn-cm,pi,pk);
ll cnt=;
for(ll i=cn;i;i/=pi)cnt+=i/pi;
for(ll i=cm;i;i/=pi)cnt-=i/pi;
for(ll i=cn-cm;i;i/=pi)cnt-=i/pi;
return up*inv(d1,pk)%pk*inv(d2,pk)%pk*ksm(pi,cnt,pk)%pk;
} ll crt(ll a,ll pk)
{
return a*inv(p/pk,pk)%p*(p/pk)%p;
} int main()
{
scanf("%lld%lld%lld",&n,&m,&p);
ll tp=p,ans=;
for(ll i=;i*i<=p;i++)
{
if(tp%i)continue;
ll pk=;
while(!(tp%i))tp/=i,pk*=i;
ans=(ans+crt(c(n,m,i,pk),pk))%p;
}
if(tp>)ans=(ans+crt(c(n,m,tp,tp),tp))%p;
printf("%lld",(ans%p+p)%p);
return ;
}
[洛谷P4720] [模板] 扩展卢卡斯的更多相关文章
- [洛谷P4777] [模板] 扩展中国剩余定理
扩展中国剩余定理,EXCRT. 题目传送门 重温一下中国剩余定理. 中国剩余定理常被用来解线性同余方程组: x≡a[1] (mod m[1]) x≡a[2] (mod m[2]) ...... x≡a ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷P4720 【模板】扩展卢卡斯
P4720 [模板]扩展卢卡斯 题目背景 这是一道模板题. 题目描述 求 C(n,m)%P 其中 C 为组合数. 输入输出格式 输入格式: 一行三个整数 n,m,p ,含义由题所述. 输出格式: 一行 ...
- 洛谷 P4720 【模板】扩展 / 卢卡斯 模板题
扩展卢卡斯定理 : https://www.luogu.org/problemnew/show/P4720 卢卡斯定理:https://www.luogu.org/problemnew/show/P3 ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- 【AC自动机】洛谷三道模板题
[题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...
- 洛谷-P5357-【模板】AC自动机(二次加强版)
题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...
- 洛谷.1919.[模板]A*B Problem升级版(FFT)
题目链接:洛谷.BZOJ2179 //将乘数拆成 a0*10^n + a1*10^(n-1) + ... + a_n-1的形式 //可以发现多项式乘法就模拟了竖式乘法 所以用FFT即可 注意处理进位 ...
随机推荐
- java 中static关键字注意事项
1.内存中存放的位置:(static修饰的方法和属性保存在方法区中,但是方法区也是堆的一部分) 内存的分区 2.什么样的属性可以定义为静态数据 例如: class person{ public Str ...
- teminal / console / shell
console从应用程序角度看的(控制台是管理员用的,唯一的) teminal从用户角度看的(终端是用户用的) 应用程序与console交互 用户与teminal交互 teminal可以不存在 tem ...
- KMP算法复杂度证明
引言 KMP算法应该是看了一次又一次,比赛的时候字符串不是我负责,所以学到的东西又还给网上的博客了-- 退役后再翻开看,看到模板,心想这不是\(O(n^2)\)的复杂度吗? 有两个循环也不能看做是\( ...
- WOW.js 和 animate.css 使用
animate.css 动画样式,用户也可以非常容易修改设置喜欢的动画库. Wow.js 允许用户滚动页面的时候展示 CSS 动画.配合animate.css ,做出很棒的效果,它支持 animate ...
- 吴裕雄--天生自然 PYTHON3开发学习:数据库连接 - PyMySQL 驱动
import pymysql # 打开数据库连接 db = pymysql.connect("localhost","testuser","test1 ...
- logstash 使用glusterfs网络存储偶发性文件解析异常的问题
其实问题到现在为止也没有解决 因为服务是部署在k8s上,挂载的,偶发性的出现文件解析异常 bom头已经验证过了 手动重新解析这些文件完全正常,问题无法复现,文件本身并没有问题. 最后怀疑到了最不该怀疑 ...
- Spring Boot从入门到放弃-Spring Boot 整合测试
站长资讯摘要:使用Spring Boot 整合测试,对Controller 中某个方法进行测试或者对Service,Mapper等进行测试,不需要运行项目即可查看运行结果是否和期望值相同,Spring ...
- SVN一直清理解决
svn作为我们经常使用的版本管理服务器,在使用过程中经常需要通过clean up操作来完成本地文件与服务器文件信息及版本信息同步,然而有时会在执行清理命令时提示“清理失败,请执行清理”,并且提示的中文 ...
- metinfo_5.3变量覆盖引发的一系列问题
metinfo_5.3中存在一个很经典的$$型变量覆盖,这种变量覆盖在之前的博客中提到过,今天的博客围绕这个变量覆盖漏洞结合这款CMS的其他功能进行漏洞利用. 变量覆盖+文件包含 拿到这个CMS首先还 ...
- drf框架与postman初始
drf框架 全称:django-rest framework 知识点 """ 1.接口:什么是接口.restful接口规范 2.CBV生命周期源码 - 基于restful ...