首页 > 其他分享 >Lucas 定理

Lucas 定理

时间:2023-01-29 15:46:17浏览次数:56  
标签:return Lucas int 定理 il ri define

简述

当问题规模很大,而模数是一个不大的质数的时候,就不能简单地通过递推求解来得到答案,需要用到 Lucas 定理

Lucas

Lucas 定理内容如下:
对于质数 \(p\),有

\[\binom{n}{m} \equiv \binom{\lfloor\frac{n}{p}\rfloor}{\lfloor\frac{m}{p}\rfloor}\cdot\binom{n\mod p}{m\mod p}\mod p \]

上式中\(n\mod p\)和\(m\mod p\)一定小于\(p\),可以直接求解,\(\binom{\lfloor\frac{n}{p}\rfloor}{\lfloor\frac{m}{p}\rfloor}\)继续用 Lucas 定理求解。边界条件:当 \(m=0\) 的时候,返回 \(1\)
复杂度为 \(O(f(p) + g(n)\log n)\),其中 \(f(n)\) 为预处理组合数的复杂度,\(g(n)\) 为单次求组合数的复杂度。

il int Lucas(int n,int m,int p){
    if(!m) return 1;
    return 1ll*Lucas(n/p,m/p,p)*C(n%p,m%p,p)%p;
}
AC·code
#include<bits/stdc++.h>
#define il inline
#define cs const
#define ri register
using namespace std;
il int rd(){
    ri int x=0,f=1;ri 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 x*f;
}
cs int N=1e5+5;
int t,n,m,P,A[N];
il int qpow(int a,int b,int p){
    ri int ans=1;
    while(b) {
        if(b&1) ans=(1ll*ans*a)%p;
        a=(1ll*a*a)%p,b>>=1;
    }
    return ans;
}
il int inv(int a,int p){
    return qpow(a,p-2,p);
}
il int C(int n,int m,int p){ // 直接算组合数
    if(m>n) return 0;
    return 1ll*A[n]*inv(A[m],p)%p*inv(A[n-m],p)%p;
}
il int Lucas(int n,int m,int p){
    if(!m) return 1;
    return 1ll*Lucas(n/p,m/p,p)*C(n%p,m%p,p)%p;
}
int main(){
    t=rd();
    while(t--){
        n=rd(),m=rd(),P=rd(),A[1]=A[0]=1; // 预处理阶乘
        for(ri int i=2;i<P;++i) A[i]=1ll*A[i-1]*i%P;
        printf("%d\n",Lucas(n+m,n,P));
    }
    return 0;
} 

exLucas

对于 \(p\) 不是素数的情况,就需要用到 exLucas 定理

AC·code
#include<bits/stdc++.h>
#define il inline int
#define vl inline void
#define cs const
#define ri register
#define int long long
using namespace std;
vl exgcd(int a,int b,int &x,int &y){
    (b==0)?(x=1,y=0):(exgcd(b,a%b,y,x),y-=(a/b)*x);
}
il inv(int a,int p){
    int x,y;exgcd(a,p,x,y);
    return (x%p+p)%p;
}
il qpow(int a,int b,int p){
    int as=1;
    while(b){
        if(b&1) as=(as*a)%p;
        a=(a*a)%p,b>>=1;
    }
    return as;
}
il getf(int n,int p,int pk){
    if(!n) return 1;
    int as=1;
    for(ri int i=2;i<pk;++i){
        if(i%p) as=(as*i)%pk;
    }
    as=qpow(as,n/pk,pk);
    for(ri int i=1+pk*(n/pk);i<=n;++i){
        if(i%p) as=(i%pk*as)%pk;
    }
    return as*getf(n/p,p,pk)%pk;
}
il getg(int n,int p){
    return (n<p)?0:(getg(n/p,p)+n/p);
}
il getc(int n,int m,int p,int pk){
    int fz=getf(n,p,pk),fm1=getf(m,p,pk),fm2=getf(n-m,p,pk);
    int qp=qpow(p,getg(n,p)-getg(m,p)-getg(n-m,p),pk);
    return qp*fz%pk*inv(fm1,pk)%pk*inv(fm2,pk)%pk;
}
il exlucas(int n,int m,int p){
    int res=p,as=0,pk;
    for(ri int i=2;i*i<p;++i){
        if(res%i==0){
            pk=1;
            while(res%i==0){
                res/=i,pk*=i;
            }
            as=(as+getc(n,m,i,pk)*inv(p/pk,pk)%p*(p/pk)%p)%p;
        }
    }
    if(res>1){
        as=(as+getc(n,m,res,res)*inv(p/res,res)%p*(p/res)%p)%p;
    }
    return as;
}
signed main(){
    int n,m,p;
    cin>>n>>m>>p;
    cout<<exlucas(n,m,p);
    return 0;
} 

标签:return,Lucas,int,定理,il,ri,define
From: https://www.cnblogs.com/windymoon/p/17072847.html

相关文章

  • 矩阵树定理
    简述Kirchhoff矩阵树定理(简称矩阵树定理)解决了一张图的生成树个数计数问题。主要步骤无向图假设现在给定一个无向图\(G\)定义度数矩阵\(D\):若存在边\((u,v,w)\),则\(D......
  • 【学习笔记】Burnside引理与Polya定理(无证)
    群论笔记Burnside引理\[置换后本质不同的数量=\frac{1}{置换方式总数}\times所有置换后与原来相同的构造方案\]注意:单位元也是置换Polya定理举例说明。考虑立方体......
  • exlucas
    i128作为下标的时候会出现奇怪ub!所以要先强转!#include<bits/stdc++.h>#defineint__int128#definepbpush_back//#definei64longlong//#defineusingnamespa......
  • 背驰转折定理
     缠中说禅-背驰转折定理:某级别趋势背驰将导致1、最后一个中枢级别扩展2、该级别更大中枢的盘整3、反趋势 出第三买卖点延续原有走势出现3卖整体级别变大......
  • 中值定理
    模型:如果一个序列\(a\)长度为\(p\),\(a_1=0,a_p=1\),需要找到一个长度为\(q\)的子序列\(a[l,r]\)使得\(a_l=0,a_r=1\),且\(q|p\),那么可以这样考虑:对于\(......
  • 线性空间的基本概念与定理1
    线性空间的基本概念与定理1.线性空间:给定集合$V$与数域$\mathbb{K}$,在$V$上定义加法运算$"+"$,以及数域$\mathbb{K}$与集合$V$之间的数乘运算,并要求上述加法运算满足交换......
  • 采样定理与SDMDM
    1.信噪比=6.02N+1.76dB对于这个经常引用的AD/DA转换器理论信噪比(SNR)公式,代表一个完美的N位ADC的理论性能。下面先计算N位模数转换器(ADC)的理论量化噪声。一旦通过计算均方根......
  • 算法学习笔记(9): 中国剩余定理(CRT)以及其扩展(EXCRT)
    扩展中国剩余定理讲解扩展之前,我们先叙述一下普通的中国剩余定理中国剩余定理中国剩余定理通过一种非常精巧的构造求出了一个可行解但是毕竟是构造,所以相对较复杂\[......
  • 扩展中国剩余定理
    学习扩展中国剩余定理前需要学习扩欧求逆元。\(\left\{\begin{matrix}x\equivc_{1}(\modm_{1})\\x\equivc_{2}(\modm_{2})\end{matrix}\right.\)\(x=c_{1}+m_{1}......
  • Codeforces 1630 E Making It Bipartite 题解 (Dilworth定理)
    题目链接首先可以想到把题目中的那张图G建出来,由于要求这张图是二分图,把它复制一遍(\(G\toG'\)),然后对于每个u,连一条无向边\(u-u'\),这样就变成了最大独立集问题。但是一......