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

题面

给定整数 n,m,p 的值,求出 Cn+mnmodp 的值。

输入数据保证 p 为质数。

注: C 表示组合数。

对于 100% 的数据,1n,m,p105

思路

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

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

除法用逆元。

代码

#include <bits/stdc++.h>
#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<b){
		return 0;
	}
	if(a<p){
		return fact[a]*data[b]*data[a-b]%p;
	}
	return lucas(a/p,b/p)*lucas(a%p,b%p)%p;
}

int solve(){
	cin>>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<<solve()<<'\n';
	}
	return 0;
}
posted @   蒟蒻xiezheyuan  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示