#include <stdio.h>
#define MAX 100
int factorial(int n);
//缓存,空间换时间,动态规划思想
int fac[MAX];
int factorial(int n);
int A(int,int);
int C(int,int);
int Z(int,int);
int main(void) {
printf("Hello World!\n");
printf("%d!=%d\n",5,factorial(5));
//A(n,m)=n×(n-1)....(n-m+1)=n!/(n-m)!
//C(n,m)=P(n,m)/P(m,m) =n!/m!(n-m)!
//Z(n,m)=C(n,n)*(c(n,1)+c(n,2)+...+c(n,m)) //n>=m>0
printf("A(5,2)=%d\n",A(5,2));
printf("C(5,2)=%d\n",C(5,2));
printf("Z(5,2)=%d\n",Z(5,2));
return 0;
}
// n!
int factorial(int n){
return fac[n] = (n<=1||n>MAX)?1:(fac[n]?fac[n]:n*factorial(n-1));
}
//A(5,3)
int A(int n,int m){
return factorial(n)/factorial(n-m);
}
int C(int n,int m){
return A(n,m)/factorial(m);
}
int Z(int n,int m){
int sum = 0;
for(int i=1;i<=m;i++){
sum += C(n,i);
}
return C(n,n)*sum;
}