【模板】Lucas定理

#include<bits/stdc++.h>
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
long long N,M,p;
using namespace std;
long long KSM(long long a,long long b,long long p) {
    long long ans=1;
    while(b) {
        if(b&1)ans=(ans*a)%p;
        a=(a*a)%p;
        b/=2;
    }
    return ans;
}
long long C(long long a,long long b) {
    if(a<b)return 0;
    if(a==b)return 1;
    if(b>a-b)b=a-b;
    long long A=1,B=1;
    for(long long i=0; i<b; ++i) {
        A=(A*(a-i))%p;
        B=(B*(b-i))%p;
    }
    return (A*KSM(B,p-2,p));
}
long long Lucas(long long n,long long m) {
    if(m==0)return 1;
    return C(n%p,m%p)*Lucas(n/p,m/p)%p;
}
int main() {
    //freopen(" .in","r",stdin);
    //freopen(" .out","w",stdout);
    cin>>N>>M>>p;
    cout<<Lucas(N+M,M);
}
posted @ 2022-12-12 20:38  changwenxuan  阅读(8)  评论(0)    收藏  举报  来源