#include<stdio.h>
//在n个里选择m个
long long cal(long long n,long long m){ //可能会有中间变量溢出
long long ans=1;
for(long long i=1;i<=n;i++)
ans*=i;
for(long long i=1;i<=m;i++)
ans/=i;
for(long long i=1;i<=n-m;i++)
ans/=i;
return ans;
}
long long cal2(long long n,long long m){ //运用递归实现,但会出现重复计算的问题
if(n<m) return 0;
if(m==n||m==0) return 1;
return cal2(n-1,m)+cal2(n-1,m-1);
}
long long res[67][67]={0};
long long cal3(long long n,long long m){
if(n<m) return 0;
if(n==m||m==0) return 1;
if(res[n][m]!=0) return res[n][m];
res[n][m]=cal3(n-1,m)+cal3(n-1,m-1);
return res[n][m];
}
int main(){
long long m,n;
printf("please input m,n:");
scanf("%lld%lld",&m,&n);
printf("C(%lld,%lld)=%lld\n",n,m,cal(n,m));
printf("C(%lld,%lld)=%lld\n",n,m,cal2(n,m));
printf("C(%lld,%lld)=%lld\n",n,m,cal3(n,m));
return 0;
}