杨辉三角有一个很重要的特性,他的数的组成是(1+x)^n的系数
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
观察(1+x)^n展开
(1+x)^0=1
(1+x)^1=1+x
(1+x)^2=1+2x+1
(1+x)^3=1+3x+3x ^2+x ^2;
每一行展开的系数刚好对应杨辉三角每一行的数字
那我们要如何计算(1+x)^n的展开系数呢?
我们只需要计算二项系数C(n,k)=n! /(k!*(n-k)!)就是展开后的系数
有了这个公式我们就可以用O(1)的时间复杂度计算
不过如果n!太大了,如果我们直接计算n!可能会溢出,此时可以利用C(n,k-1)和C(n,k)的递推关系C(n,k)/C(n,k-1)=(n-k+1)/k逐个递推,应该避免直接计算n!
例题:HDU_2032
在这个例子中,我们要注意杨辉三角的第一行的n=0,第二行n=1…以此类推
初始时C(i,i)==C(i,0)=1;
i代表n,从零开始
j代表k
附上AC代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int maxn=1e6+7;
ll a[maxn];
int main()
{
int t,n;
int c[35][35];
while(~scanf("%d",&n)){
for(int i=0;i<n;i++){
c[i][0]=1;
c[i][i]=1;
}
for(int i=0;i<n;i++){
for(int j=1;j<i;j++){
c[i][j]=c[i][j-1]*(i-j+1)/j;
}
}
for(int i=0;i<n;i++){
for(int j=0;j<=i;j++){
printf("%d%c",c[i][j],j==i?'\n':' ');
}
}
cout<<endl;
}
return 0;
}