Lucas定理(p为质数):

\(C_n^m=C_{n/p}^{m/p}*C_{n\ mod\ p}^{m\ mod\ p}\)

可是p不为质数怎么办呢?

ex_Lucas定理 (p不为质数)

  • 思路

    因为Lucas定理只能解决质数的情况,于是我们把P分解质因数, \(P=mul(p^k)\)

    然后对于每个\(p^k\)求出对应的\(md\ =C_n^m\ mod\ pk\),然后用CRT(中剩)合并出最后的答案,是不是非常有趣

    \(C_n^m=\frac{n!} {(n-m)!m!}\) (mod \(p^k\)意义下)

    因为要求逆元但是\((n-m)!m!\)可能不与\(p^k\)互质,所以我们提出,质因数\(p\):

    \(C_n^m=\frac{\frac{n!}{p^a}} {\frac{(n-m)!}{p^b}\ \ \frac{m!}{p^c}}*p^{a-b-c}\)

所以求:\(n!\ mod\ p^k\)

乘积显然会以\(p^k\)为循环节,注意乘的时候要记得跳过\(p\)的倍数,然后最后一段不完整的组暴力处理

注意代码处理中我们会直接跳过p的倍数但是,对于 \(k\)属于[\(1\),\(n/p\)] , \(p*k\)中\(k\)会被我们跳过,因此我们采用递归的手段,因此多处理\((n/p)!\ mod\ p^k\)

  • 代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e7+5;
ll r[N],md[N],jc[N];
ll ksm(ll t,ll b,ll mod) {
ll mul=1;
for(ll i=b;i;i>>=1,t=t*t%mod) if(i&1) mul=mul*t%mod;
return mul;
}
ll ex_gcd(ll a,ll b,ll &x,ll &y) {
if(b==0) {x=1; y=0; return a;}
ll d=ex_gcd(b,a%b,x,y);
ll xx=x; x=y; y=xx-a/b*y;
return d;
}
ll inv(ll u,ll p) {
ll v,k,d=ex_gcd(u,p,v,k);
v%=(p/d);
if(v<0) v+=(p/d);
return v;
}
ll fac(ll n,ll pk,ll p) {
if(n==0||n==1) return 1;
return fac(n/p,pk,p)*ksm(jc[pk],n/pk,pk)%pk*jc[n%pk]%pk;
}
ll Cnt(ll n,ll p) {
ll sum=0;
for(ll i=n;i;i/=p) sum+=i/p;
return sum;
}
ll C_modpk(ll n,ll m,ll p,ll pk) {
jc[0]=1;
for(ll i=1;i<=pk;i++) //加速技巧
if(i%p) jc[i]=jc[i-1]*i%pk;
else jc[i]=jc[i-1];
return fac(n,pk,p)*inv(fac(m,pk,p),pk)%pk*inv(fac(n-m,pk,p),pk)%pk*ksm(p,(Cnt(n,p)-Cnt(m,p)-Cnt(n-m,p)),pk)%pk;
}
ll CRT(int tot) {
ll mul=1,sum=0,x,y;
for(int i=1;i<=tot;i++) mul*=md[i];
for(int i=1;i<=tot;i++) {
ll d=ex_gcd(mul/md[i],md[i],x,y);
sum+=(mul/md[i])*x%mul*r[i]%mul%mul,sum=(sum%mul+mul)%mul;
}
return sum;
}
ll ex_Lucus(ll n,ll m,ll P) {
int tot=0;
for(ll p=2;p*p<=P;p++) {
ll pk=1;
if(!(P%p)) {
while(!(P%p)) {P/=p; pk*=p; }
md[++tot]=pk; r[tot]=C_modpk(n,m,p,pk);
}
}
if(P>1) {
md[++tot]=P; r[tot]=C_modpk(n,m,P,P);
}
ll ans=CRT(tot);
return ans;
}
int main() {
ll n,m,p;
scanf("%lld%lld%lld",&n,&m,&p);
if(n<m) swap(n,m);
printf("%lld",ex_Lucus(n,m,p));
return 0;
}

ex_Lucas定理的更多相关文章

  1. Lucas定理学习笔记(没有ex_lucas)

    题目链接\(Click\) \(Here\) \(ex\_lucas\)实在是不能学的东西...简单学了一下\(Lucas\)然后打算就这样鸽着了\(QwQ\)(奶一口不可能考) 没什么复杂的,证明的 ...

  2. [总结]数论和组合计数类数学相关(定理&证明&板子)

    0 写在前面 0.0 前言 由于我太菜了,导致一些东西一学就忘,特开此文来记录下最让我头痛的数学相关问题. 一些引用的文字都注释了原文链接,若侵犯了您的权益,敬请告知:若文章中出现错误,也烦请告知. ...

  3. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  4. Mittag-Leffler定理,Weierstrass因子分解定理和插值定理

    Mittag-Leffler定理    设$D\subset\mathbb C$为区域,而$\{a_{n}\}$为$D$中互不相同且无极限点的点列,那么对于任意给定的一列自然数$\{k_{n}\}$, ...

  5. 【转】Polya定理

    转自:http://endlesscount.blog.163.com/blog/static/82119787201221324524202/ Polya定理 首先记Sn为有前n个正整数组成的集合, ...

  6. hdu 4704 Sum (整数和分解+快速幂+费马小定理降幂)

    题意: 给n(1<n<),求(s1+s2+s3+...+sn)mod(1e9+7).其中si表示n由i个数相加而成的种数,如n=4,则s1=1,s2=3.                  ...

  7. poj1006Biorhythms(同余定理)

    转自:http://blog.csdn.net/dongfengkuayue/article/details/6461298 本文转自head for better博客,版权归其所有,代码系本人自己编 ...

  8. CF451E Devu and Flowers (隔板法 容斥原理 Lucas定理 求逆元)

    Codeforces Round #258 (Div. 2) Devu and Flowers E. Devu and Flowers time limit per test 4 seconds me ...

  9. 大组合数:Lucas定理

    最近碰到一题,问你求mod (p1*p2*p3*……*pl) ,其中n和m数据范围是1~1e18 , l ≤10 , pi ≤ 1e5为不同的质数,并保证M=p1*p2*p3*……*pl ≤ 1e18 ...

随机推荐

  1. layui文件上传组件“请求上传接口出现异常”问题解决方案

    这是一个悲伤的故事,以前开发项目用过很多次这个组件,这次使用了Token,于是报了一些莫名其妙的错误,来复盘一下,警示自己! 刚开始接触layui的同学们肯定经常会看到这个错误 下面我们对这个异常的处 ...

  2. 设计模式之:享元模式FlyweightPattern的实现

    享元模式的理解: 享元模式的定义:运用共享技术支持大量细粒度对象的复用: Flyweight Pattern Definition:Use sharing to support large numbe ...

  3. Python的组合数据类型

    """ Python的组合类型: 序列类型:元素之间存在先后关系,可以通过索引来访问 列表: 元组: 字符串: 映射类型:用键值来表示数据 字典: 集合类型:元素是无序的 ...

  4. What is ACPI

    What is ACPI, OnNow, and PCI Power Management? Microsoft began an initiative called OnNow to shorten ...

  5. 4.Java开发环境的搭建

    Java开发环境搭建 一.JDK下载与安装 JDK8下载地址 选择目录,点击下一步 二.配置环境变量 变量名:JAVA_HOME 变量值:JDK安装路径 变量值:CLASSPATH 变量值:.;%JA ...

  6. JavaWeb学习day8-Response排错

    用字符串接收送前端返回的数据并输出 1 req.setCharacterEncoding("UTF-8"); 2 resp.setCharacterEncoding("U ...

  7. SpringMVC初学习

    # SpringMVC快速入门 @[TOC](文章目录) --- # 前言 `提示:这里可以添加本文要记录的大概内容:` 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习 ...

  8. 2021.05.03 T3 数字

    2021.05.03 T3 数字 问题描述 一个数字被称为好数字当他满足下列条件: 1. 它有**2*n**个数位,n是正整数(允许有前导0) 2. 构成它的每个数字都在给定的数字集合S中. 3. 它 ...

  9. Android 蓝牙串口通信工具类 SerialPortUtil 3.0.+

    建议使用4.+版本,避免一些不必要的bug.4.+版本文档地址:https://www.cnblogs.com/shanya/articles/16062256.html SerialPortUtil ...

  10. 杭电2091空心三角形Java(AC)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2091 把三角形写入二维数组里,然后输出出来 注意事项: 1.三角形后面没有空格(每一层的后面) 2.三角形 ...