Lucas定理
  kgNvaGSWJ8xL 2023年11月02日 59 0
C++

Lucas定理:

主要是求$C_{n}^{m}$在模$p$情况下($mod \, p$)(一般$p$较小,而$n,m$较大的情况)

公式:

$ C_{n}^{m} ≡  C_{n \, mod \, p}^{m \, mod \, p} \times C_{n/p}^{m/p}  (mod \, p) $

证明以后补吧

就以这题来说明具体解法:

题目

Luogu P3807 【模板】卢卡斯定理/Lucas 定理

Code:

//From:201929
#include<bits/stdc++.h>
#define L long long
using namespace std;
L pq[100005];
L n,m,mod;
L quick(L x,L y)//快速幂
{
    L ans=1;
    while(y)
    {
        if(y%2) ans=(ans*x)%mod;
        y>>=1;
        x=(x*x)%mod;
    }
    return ans;
}
L q(L x,L y)
{
    if(y>x) return 0;
    return (pq[x]*quick(pq[y],mod-2))%mod*quick(pq[x-y],mod-2)%mod;
    //pq[x]/pq[y]/pq[x-y]
    //逆元变成pq[x]*(pq[y]^(mod-2))*(pq[x-y]^(mod-2))
    //暴力求解C x,y的值
}
L lucas(L x,L y)
{
    if(y==0) return 1ll;
    return (lucas(x/mod,y/mod)*q(x%mod,y%mod))%mod;
}
int main()
{

    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld%lld%lld",&n,&m,&mod);
        pq[0]=1;
        for(int i=1;i<=mod;i++) pq[i]=(pq[i-1]*i)%mod;
        //预处理小情况(x<mod)的答案
        printf("%lld\n",lucas(n+m,m));
    }
    return 0;
}

 

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  8Tw5Riv1mGFK   2024年05月01日   78   0   0 C++
  BYaHC1OPAeY4   2024年05月08日   56   0   0 C++
  yZdUbUDB8h5t   2024年05月05日   43   0   0 C++
  oXKBKZoQY2lx   2024年05月17日   56   0   0 C++
kgNvaGSWJ8xL