线性
#include <stdio.h>
#include <string.h>
int C(int n,int m)
{
if(m < n-m) m = n-m;
int ans=1,i;
for(i=m+1;i<=n;i++) ans*=i;
for(i=1;i<n-m;i++) ans/=i;
return ans;
}
int main(void)
{
int n,m;
scanf("%d%d",&n,&m);
int x =C(n,m);
printf("%d\n",x);
return 0;
}
组合数
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
ll fac[250005];
ll pow_mod(ll a,ll k)
{
ll ans = 1;
while(k)
{
if(k & 1)
{
ans = ans*a%mod;
}
a = a*a%mod;
k /= 2;
}
return ans;
}
ll inv(ll x)
{
return pow_mod(x,mod-2);
}
ll C(ll m,ll n)
{
return fac[m]*inv(fac[m-n]) % mod * inv(fac[n])%mod;
}
int main()
{
ll t,n,m,i,j;
fac[0] = 1;
for(i=1;i<250005;i++) fac[i] = fac[i-1]*i%mod;
scanf("%d%d",&n,&m);
C(n,m);
return 0;
}