n,m大,MOD小
#include <stdio.h>
using namespace std;
#define ll long long
const int N=1000100;
const int MOD=99991;
ll f[N];
ll Fp(ll a,ll n)
{
ll ans=1;
while(n)
{
if(n&1) ans=(ans*a)%MOD;
a=a*a%MOD;
n>>=1;
}
return ans;
}
ll Lucas(ll a,ll k)
{
ll ans=1;
while(a&&k)
{
ll a1=a%MOD;
ll b1=k%MOD;
if(a1<b1) return 0;
ans=ans*f[a1]*Fp(f[b1]*f[a1-b1]%MOD,MOD-2)%MOD;
a/=MOD;
k/=MOD;
}
return ans;
}
void Init()
{
f[0]=1;
for(int i=1;i<=MOD;i++)
{
f[i]=f[i-1]*i%MOD;
}
}
int main()
{
Init();
printf("%I64d\n",Lucas(5,2));
}
n,m小,MOD大
#include <stdio.h>
using namespace std;
#define ll long long
const int MOD=1e9+7;
const int N=1000100;
ll f[N],v[N];
ll Fp(ll a,ll n)
{
ll ans=1;
while(n)
{
if(n&1) ans=(ans*a)%MOD;
a=a*a%MOD;
n>>=1;
}
return ans;
}
ll C(int n,int m)
{
if(n<m) return 0;
return f[n]*Fp(f[m],MOD-2)%MOD*Fp(f[n-m],MOD-2)%MOD;
}
void Init()
{
f[0]=1;v[0]=1;
for(int i=1;i<N;i++) f[i]=f[i-1]*i%MOD;
}
int main()
{
Init();
printf("%I64d\n",C(5,2));
}
n,m很小
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll __int64
const int MOD=1000000007;
const int N=20;
ll C[N][N];
int main()
{
C[0][0]=C[1][0]=C[1][1]=1;
for(int i=2;i<N;i++)
{
C[i][0]=1;
for(int j=1;j<N;j++)
{
C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD;
}
}
}