组合数取模1:卢卡斯定理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_42369449/article/details/83105513

模板:

#include<iostream>
#include<algorithm>
#include<cstdio>
#define ll long long
#define N 100005
using namespace std;
int k,n,m,p;
ll inv[N],jc[N];
void ny()
{
	inv[0]=1;
	inv[1]=1;
	for(int i = 2;i <= p;i++)
	{
		inv[i]=(p-p/i)*inv[p%i]%p;
	}
}
ll lucas(int x,int y)
{
    if(x<y) return 0;
    else if(x<p) return jc[x]*inv[y]*inv[x-y]%p;
    else return lucas(x/p,y/p)*lucas(x%p,y%p)%p;
}
int main()
{
    scanf("%d%d%d",&n,&m,&p);
    ny();
    jc[0]=jc[1]=1;
    for(int i = 2;i <= p;i++) jc[i]=jc[i-1]*i%p;
    for(int i = 2;i <= p;i++) inv[i]=inv[i-1]*inv[i]%p;
    printf("%I64d\n",lucas(n,m));
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42369449/article/details/83105513