杨辉三角的数字和二项式展开的系数有对应关系,如下图:

通过二项式定理:,我们可以用杨辉三角形的性质来求组合数。时间复杂度O(n^2)

int n;
ll c[maxn][maxn];
void init(){
    for(int i = 0;i <= n;i++){
        c[i][0] = 1;
        for(int j = 1;j <= i;j++){
            c[i][j] = (c[i-1][j-1]+c[i-1][j])%mod;
        }
    }
}

还有一个O(n)的算法,运用性质:,可以算出指定n的

int n;
ll c[maxn];
void init(){
    c[0] = 1;
    for(int i = 1;i <= n;i++){
        c[i] = c[i-1]*(n-i+1)/i;
    }
}    

推荐一个例题:牛客Wannafly挑战赛18 - A题

AC代码:

#include <bits/stdc++.h>

using namespace std;
const int maxn = 1e3+10;
const int mod = 1e9+7;
typedef long long ll;
int n;
ll c[maxn][maxn];
void init(){
    for(int i = 0;i <= n;i++){
        c[i][0] = 1;
        for(int j = 1;j <= i;j++){
            c[i][j] = (c[i-1][j-1]+c[i-1][j])%mod;
        }
    }
}

int main()
{
    scanf("%d",&n);
    init();
    /*for(int i = 0;i <= n-1;i++){
        cout<<c[i]<<" ";
    }*/
    ll ans = 0;
    for(int i = 0;2*i <= (n-1);i=i+2){
        ans = (ans + c[n-1][i]*c[n-1-i][i]%mod)%mod;
    }
    printf("%lld\n",ans);
    return 0;
}