题目描述
给出组合数 C(n,m) 表示从 n 个元素中选出 m 个元素的方案数。例如 C(5,2)=10,C(4,2)=6。可是当 n,m 比较大的时候,C(n,m) 很大。于是 xiaobo 希望你输出C(n,m)modp 的值。
输入
输入数据第一行是一个正整数 T,表示数据组数;
接下来是 T 组数据,每组数据有 3 个正整数 n,m,p。
对于所有数据,T≤100,1≤m≤n≤109,m≤104,m<p<109,p 是素数。
输出
对于每组数据,输出一个正整数,表示 C(n,m)modp 的结果。
样例输入
2
5 2 3
5 2 61
样例输出
1
10
思路:对于卢卡斯定理的运用,直接套板子。但是我虽然看懂了定理的式子,但对于代码的实现也不是很透彻,下次碰到也直接套板子吧
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll fastpow(ll n, ll k, ll p)
{
ll ans=1,cnt=n;
while(k)
{
if(k&1)ans=(ans*cnt)%p;
cnt=(cnt*cnt)%p;
k>>=1;
}
return ans;
}
ll comb(ll n, ll m, ll p)//求小数字的C(n,m)
{
if(m>n)return 0;//不符合数学要求
if(m>n-m)m=n-m;//简化计算
if(m==0)return 1