卡特兰数
#include <bits/stdc++.h>
using namespace std;
int f[20];
int n;
int main()
{
cin >> n;
f[0] = f[1] = 1;
for (int i = 2; i <= n; i++)
{
for (int j = 0; j < i; j++)
{
f[i] += f[j] * f[i - j - 1];
}
}
cout << f[n];
return 0;
}
斯特林数
typedef long long ll;
const int N = 105;
ll s1[N][N];
void stirling1()
{
s1[1][1] = 1;
for (int i = 2; i <= n; i++)
{
for (int j = 1; j <= i; j++)
{
s1[i][j] = s1[i - 1][j] * (i - 1) + s1[i - 1][j - 1];
}
}
}
const int N = 105;
ll s2[N][N];
void stirling2()
{
s2[1][1] = 1;
for (int i = 2; i <= n; i++)
{
for (int j = 1; j <= i; j++)
{
s2[i][j] = s2[i - 1][j] * j + s2[i - 1][j - 1];
}
}
}
卢卡斯定理
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll q_pow(ll a,ll b,ll p)
{
ll ans=1;
while(b)
{
if(b&1)
ans=(ans*a)%p;
a=(a*a)%p;
b>>=1;
}
return ans;
}
ll comb(ll a,ll b,ll p)
{
if(a<b) return 0;
if(b==a) return 1;
if(b>a-b) b=a-b;
ll ans=1,ca=1,cb=1;
for(int i=0; i<b; i++)
{
ca=(ca*(a-i))%p;
cb=(cb*(b-i))%p;
}
ans=(ca*q_pow(cb,p-2,p))%p;
return ans;
}
ll lucas(ll a,ll b,ll p)
{
ll ans=1;
while(a&&b&&ans)
{
ans=(ans*comb(a%p,b%p,p))%p;
a/=p;
b/=p;
}
return ans%p;
}
int main()
{
ll t,n,m,p;
cin>>t;
while(t--)
{
cin>>n>>m>>p;
cout<<lucas(n+m,n,p)<<endl;
}
return 0;
}