扩展卢卡斯定理(Exlucas)
题目链接
前置知识
- 中国剩余定理(crt)或扩展中国剩余定理(excrt)
- 乘法逆元
- 组合数的基本运用
- 扩展欧几里得(exgcd)
说实话Lucas真的和这个没有什么太大的关系,但是Lucas还是要学学的:戳我
正文
题目是要求:
\]
如果这个p是质数的话那太简单了,直接Lucas就好了,但问题是现在p不一定是一个质数。
我们令 \(P=\prod {p_i}^{c_i}\)
我们如果知道每个\(c_n^m mod \ p_i^{c_i}\)的值的话就可以根据中国剩余定理求出答案
那我们怎么求出这个值呢?
我们可以将\(c_n^m\)写成\(\frac{n!}{m!(n-m)!}\)
现在我们可以处理阶乘的模。那么如何处理阶乘的模呢?
举个经典例子:
\(p=3,n=19,c=2\)时
我们可以吧式子写成这样:
\]
\]
我们可以将他分为几个部分
\]
我们会发现对于每一个整的部分如\((8*7*5*4*2*1)\)的模数都是一样的,于是这一块我们可以运用快速幂,而剩余的\(19\)我们可以进行暴力。对于\(6!\)我们可以继续递归求解,那么怎么分组呢
我们可以把每一段的范围定为\(p^c\)。差不多就这样吧。
code
#include<bits/stdc++.h>
#define rg register
#define int long long
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
return f*x;
}
inline void exgcd(int a,int b ,int &x,int &y){
if(!b){x=1,y=0;return;}
exgcd(b,a%b,x,y);
int t=x;
x=y,y=t-(a/b)*y;
}
inline int inv(int a,int b){
int x,y;
return exgcd(a,b,x,y),(x%b+b)%b;
}
inline int ksm(int a,int b,int p){
int ans=1;
while(b){
if(b&1)
ans=a*ans%p;
a=a*a%p;
b>>=1;
}
return ans%p;
}
inline int crt(int x,int p,int mod){
return inv(p/mod,mod)*(p/mod)*x;
}
inline int fac(int x,int a,int b){
if(!x)
return 1;
int ans=1;
for(int i=1;i<=b;i++)
if(i%a)
ans*=i,ans%=b;
ans=ksm(ans,x/b,b);
for(int i=1;i<=x%b;i++)
if(i%a)
ans*=i,ans%=b;
return ans*fac(x/a,a,b)%b;
}
inline int C(int n,int m,int a,int b){
int N=fac(n,a,b),M=fac(m,a,b),Z=fac(n-m,a,b),sum=0;
for(int i=n;i;i=i/a)
sum+=i/a;
for(int i=m;i;i=i/a)
sum-=i/a;
for(int i=n-m;i;i=i/a)
sum-=i/a;
return N*ksm(a,sum,b)%b*inv(M,b)%b*inv(Z,b)%b;
}
inline void exlucas(int n,int m,int p){
int t=p,ans=0;
for(int i=2;i*i<=p;i++){
int k=1;
while(t%i==0)
k*=i,t/=i;
ans+=crt(C(n,m,i,k),p,k),ans%=p;
}
if(t>1)
ans+=crt(C(n,m,t,t),p,t),ans%=p;
printf("%d",ans%p);
}
main(){
int n=read(),m=read(),p=read();
exlucas(n,m,p);
return 0;
}
扩展卢卡斯定理(Exlucas)的更多相关文章
- 【学习笔记】扩展卢卡斯定理 exLucas
引子 求 \[C_n^m\ \text{mod}\ p \] 不保证 \(p\) 是质数. 正文 对于传统的 Lucas 定理,必须要求 \(p\) 是质数才行.若 \(p\) 不一定是质数,则需要扩 ...
- 【知识总结】扩展卢卡斯定理(exLucas)
扩展卢卡斯定理用于求如下式子(其中\(p\)不一定是质数): \[C_n^m\ mod\ p\] 我们将这个问题由总体到局部地分为三个层次解决. 层次一:原问题 首先对\(p\)进行质因数分解: \[ ...
- bzoj2142 礼物——扩展卢卡斯定理
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2142 前几天学了扩展卢卡斯定理,今天来磕模板! 这道题式子挺好推的(连我都自己推出来了) , ...
- 卢卡斯定理&扩展卢卡斯定理
卢卡斯定理 求\(C_m^n~mod~p\) 设\(m={a_0}^{p_0}+{a_1}^{p_1}+\cdots+{a_k}^{p_k},n={b_0}^{p_0}+{b_1}^{p_1}+\cd ...
- LG4720 【模板】扩展卢卡斯定理
扩展卢卡斯定理 求 \(C_n^m \bmod{p}\),其中 \(C\) 为组合数. \(1≤m≤n≤10^{18},2≤p≤1000000\) ,不保证 \(p\) 是质数. Fading的题解 ...
- 洛谷 P4720 【模板】扩展 / 卢卡斯 模板题
扩展卢卡斯定理 : https://www.luogu.org/problemnew/show/P4720 卢卡斯定理:https://www.luogu.org/problemnew/show/P3 ...
- CRT中国剩余定理 & Lucas卢卡斯定理
数论_CRT(中国剩余定理)& Lucas (卢卡斯定理) 前言 又是一脸懵逼的一天. 正文 按照道理来说,我们应该先做一个介绍. 中国剩余定理 中国剩余定理,Chinese Remainde ...
- P4720【模板】扩展卢卡斯,P2183 礼物
扩展卢卡斯定理 最近光做模板了 想了解卢卡斯定理的去这里,那题也有我的题解 然而这题和卢卡斯定理并没有太大关系(雾 但是,首先要会的是中国剩余定理和exgcd 卢卡斯定理用于求\(n,m\)大,但模数 ...
- [学习笔记]扩展LUCAS定理
可以先做这个题[SDOI2010]古代猪文 此算法和LUCAS定理没有半毛钱关系. [模板]扩展卢卡斯 不保证P是质数. $C_n^m=\frac{n!}{m!(n-m)!}$ 麻烦的是分母. 如果互 ...
随机推荐
- 在Altium Designer 9中如何实现元器件旋转45°放置
方法一: 双击元件手工输入指定角度. 方法二: 在Preferences >> PCB Editor >> General中将Rotation Step(旋转的步进值)由90改 ...
- Vertrigo Serv + testlink 环境搭建
今天偶要教大家,使用VertrigoServ来搭建PHP服务器平台.有兴趣的你将会马上拥有一台PHP的WEB服务器哦,呵呵! 第一次给偶的感觉类似于我们租用的PHP虚拟主机.功能可和APPSERV媲美 ...
- 决策树 ID3 C4.5 CART(未完)
1.决策树 :监督学习 决策树是一种依托决策而建立起来的一种树. 在机器学习中,决策树是一种预测模型,代表的是一种对象属性与对象值之间的一种映射关系,每一个节点代表某个对象,树中的每一个分叉路径代表某 ...
- 上传图片用图片文件的对象hash哈希值判断图片是否一样,避免重复提交相同的图片到服务器中
上传图片用图片文件的对象hash哈希值判断图片是否一样,避免重复提交相同的图片到服务器中 前端:要用到一个插件,点击下载 <!DOCTYPE html> <html xmlns=&q ...
- ffmpeg-URL(转)
ffmpeg中为方便对资源进行访问,定义了两个结构体,URLContext中是对具体资源文件进行操作的上下文,URLProtocol则是在将资源进行分类的基础上,对某一类资源操作的函数集,熟悉Linu ...
- linux下静态库和动态库一些东西
http://www.cnblogs.com/changefuture/archive/2011/12/22/2297460.html Linux 动态链接库和静态库示例 文件预览 文件目录树如下, ...
- 升级到Win10 周年更新版
尝试过强制刷更新,但是没用,最近微软才跟我的机器推送周年更新,于是更新. 花费了些时间更新,之前网上有的那些诗句,亲眼看看还是蛮有意思的. 但是更新完了后,explorer 一直出错,有闪退(闪屏)一 ...
- JanusGraph :Cassandra作为存储后端的情况下,JanusGraph的安装方法
Cassandra作为存储后端的情况下,JanusGraph的安装方法 Cassandra作为存储后端的情况下,JanusGraph的安装分为四种方式. 分别是: 1.本地服务器模式(这里的服务器指的 ...
- Oracle树查询,start with connect by prior 递归查询用法(转载)
本人觉得这个写的真不错,实用性强,就转载过来了 这个子句主要是用于B树结构类型的数据递归查询,给出B树结构类型中的任意一个结点,遍历其最终父结点或者子结点. 先看原始数据: 1 create tabl ...
- SpringBoot24 SpringDataJPA环境搭建、实体类注解、关联查询
1 版本说明 JDK:1.8 MAVEN:3.5 SpringBoot:2.0.4 IDEA:旗舰版207.2 MySQL:5.5 2 SpringDataJPA环境搭建(SpringBoot版本) ...