关于第5篇题解
查看原帖
关于第5篇题解
370037
_farawaystar_楼主2022/11/22 12:03
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#define ll long long
using namespace std;
const ll maxn = 1e5+15;
ll n,m,p,T,fac[maxn];
ll pow(ll b,ll q)//求逆元,费马小定理 
{
    ll ans=1;
    for(;q;q>>=1,b=b*b%p) {
        if(q&1) ans=ans*b%p;
    }
    return ans%p;
}
ll C(ll n,ll m)
{
    if(m > n)return 0;
    return fac[n]*pow((fac[m]*fac[n-m])%p,p-2)%p;
}
ll Lucas(ll n,ll m)
{
    if(m == 0) return 1;
    return (Lucas(n/p,m/p)*C(n%p,m%p))%p;//进入到C中的参数均小于P,所以初始阶乘时只需预处理到p即可
    //这也是卢卡斯定理只适用与p<1e5的原因 
}
int main()
{
    cin>>T;
    while(T--) {
        cin>>n>>m>>p;
        fac[0] = 1;;
        for(int i=1;i<=p;i++)fac[i] = fac[i-1]*i%p;//预处理出阶乘 
        printf("%lld\n",Lucas(n+m,m)%p);
    }
    return 0;
}

请问为什么函数调用的是 lucas(n+m,m)lucas(n+m,m)

2022/11/22 12:03
加载中...