思路:
Lucas定理
YBTOJ
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
ll p=10007;
ll n, m, t, f[10010], inv[10010];
ll qpow(ll x, ll t)
{
ll sum=1ll;
while(t)
{
if(t&1)
sum=sum*x%p;
x=x*x%p;
t>>=1;
}
return sum;
}
void fac()
{
f[0]=f[1]=1;
inv[0]=inv[1]=1;
for(ll i=2; i<=p; i++)
{
f[i]=f[i-1]*i%p;
inv[i]=(p-p/i)*inv[p%i]%p;
}
for(ll i=2; i<=p; i++)
inv[i]=inv[i-1]*inv[i]%p;
}
ll C(ll n, ll m)
{
if(n<m)
return 0;
return f[n]*inv[m]%p*inv[n-m]%p;
}
ll lucas(ll n, ll m)
{
if(m==0)
return 1;
return C(n%p, m%p)*lucas(n/p,m/p)%p;
}
int main()
{
fac();
scanf("%lld", &t);
while(t--)
{
scanf("%lld%lld", &n, &m);
printf("%lld\n", lucas(n, m));
}
return 0;
}
Luogu
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
ll p;
ll n, m, t, f[100100], inv[100100];
ll qpow(ll x, ll t)
{
ll sum=1ll;
while(t)
{
if(t&1)
sum=sum*x%p;
x=x*x%p;
t>>=1;
}
return sum;
}
void fac()
{
f[0]=f[1]=1;
inv[0]=inv[1]=1;
for(ll i=2; i<=p; i++)
{
f[i]=f[i-1]*i%p;
inv[i]=(p-p/i)*inv[p%i]%p;
}
for(ll i=2; i<=p; i++)
inv[i]=inv[i-1]*inv[i]%p;
}
ll C(ll n, ll m)
{
if(n<m)
return 0;
return f[n]*inv[m]%p*inv[n-m]%p;
}
ll lucas(ll n, ll m)
{
if(m==0)
return 1;
return C(n%p, m%p)*lucas(n/p,m/p)%p;
}
int main()
{
scanf("%lld", &t);
while(t--)
{
scanf("%lld%lld%lld", &n, &m, &p);
fac();
ll n1=n;
n+=m;
m=n1;
printf("%lld\n", lucas(n, m));
}
return 0;
}