一、递推O(nm)
Cba=Cb−1a−1+Cba−1
即可以将从a个苹果中选b个分为选/不选苹果A,前者是选(只需从剩余a−1个中选b−1个,后者是不选(还需选b个)
for(int i=0;i<=2000;i++)
{
for(int j=0;j<=i;j++)
{
if(!j) f[i][j]=1;
else f[i][j]=(f[i-1][j-1]+f[i-1][j])%mod;
}
}
二、快速幂O(logk)
Cba=a!b!×(a−b)!=a!×infact(b!)×infact((a−b)!)
fact[i]数组记录i!、infact[i]记录(i!)−1
逆元
封装
typedef long long LL;
const int N = 1e5+10, mod = 1e9+7;
int fact[N], infact[N];
LL qmi(int a, int b, int p)
{
LL res = 1 % p;
while(b){
if(b & 1) res = (LL)res * a % p;
a = (LL)a * a % p;
b >>= 1;
}
return res;
}
int C(int a, int b)
{
return ((LL)fact[a] * infact[b] % mod * infact[a - b]) % mod;
}
void solve()
{
memset(fact, 0, sizeof fact);
memset(infact, 0, sizeof infact);
fact[0] = 1, infact[0] = 1;
for (int i = 1; i < N; i ++)
{
fact[i] = (LL)i * fact[i - 1] % mod;
infact[i] = (LL)infact[i - 1] * qmi(i, mod - 2, mod) % mod;
}
// 调用C(a,b)
int n;
scanf("%d", &n);
while (n --)
{
int a, b;
scanf("%d %d", &a, &b);
printf("%lld\n", C(a, b));
}
}
套板子题:lc2541