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


题面

给定整数 \(n, m, p\) 的值,求出 \(C_{n + m}^n \bmod p\) 的值。

输入数据保证 \(p\) 为质数。

注: \(C\) 表示组合数。

对于 \(100\%\) 的数据,\(1 \leq n, m, p \leq 10^5\)

思路

Lucas定理模版题。数字大的用Lucas分解,数字小的直接算。

C(n,m) mod p=C(n%p,m%p) * C(n/p,m/p) mod p

除法用逆元。

代码

#include 
#define int long long
using namespace std;

int fact[100005];
int data[1000005];
int n,m,p;

int lucas(int a,int b){
	if(a>n>>m>>p;
	n+=m;
	data[0]=data[1]=fact[0]=fact[1]=1;
	for(int i=2;i<=n;i++){
		fact[i]=fact[i-1]*i%p;
		data[i]=(p-p/i)*data[p%i]%p;
	}
	for(int i=2;i<=n;i++){ // 无法理解的代码开始了
		data[i]=data[i-1]*data[i]%p;
	}
	return lucas(n,m);
}

signed main(){
	int t;
	cin>>t;
	while(t--){
		cout<