组合数的计算C(n,m)
#include<bits/stdc++.h>
using namespace std;
long long cal(int n,int m) {
long long answer=1;
for(int i=1; i<=n; i++) {
answer*=i;
}
for(int i=1; i<=m; i++) {
answer/=i;
}
for(int i=1; i<=n-m; i++) {
answer/=i;
}
return answer;
}
long long cal1(int n,int m) {
if(n==m||m==0) return 1;
else {
return cal1(n-1,m)+cal1(n-1,m-1);
}
}
long long res[67][67]= {0};
long long cal2(int n,int m) {
if(n==m||m==0) {
return 1;
}
if(res[n][m]!=0) {
return res[n][m];
}
return res[n][m]=cal2(n-1,m)+cal2(n-1,m-1);
}
void cal3(int n,int m) {
for(int i=0; i<n; i++) {
res[i][0]=res[i][i]=1;
}
for(int i=2; i<=n; i++) {
for(int j=1; j<=n/2; j++) {
res[i][j]=res[i-1][j]+res[i-1][j-1];
res[i][i-j]=res[i][j];
}
}
return ;
}
long long cal4(int n,int m) {
long long answer=1;
for(int i=1; i<=m; i++) {
answer=answer*(n-m+i)/i;
}
return answer;
}
int main() {
int n,m;
while(cin>>n>>m) {
cal3(n,m);
cout<<res[n][m]<<endl;
cout<<cal4(n,m)<<endl;
}
return 0;
}
using namespace std;
long long cal(int n,int m) {
long long answer=1;
for(int i=1; i<=n; i++) {
answer*=i;
}
for(int i=1; i<=m; i++) {
answer/=i;
}
for(int i=1; i<=n-m; i++) {
answer/=i;
}
return answer;
}
long long cal1(int n,int m) {
if(n==m||m==0) return 1;
else {
return cal1(n-1,m)+cal1(n-1,m-1);
}
}
long long res[67][67]= {0};
long long cal2(int n,int m) {
if(n==m||m==0) {
return 1;
}
if(res[n][m]!=0) {
return res[n][m];
}
return res[n][m]=cal2(n-1,m)+cal2(n-1,m-1);
}
void cal3(int n,int m) {
for(int i=0; i<n; i++) {
res[i][0]=res[i][i]=1;
}
for(int i=2; i<=n; i++) {
for(int j=1; j<=n/2; j++) {
res[i][j]=res[i-1][j]+res[i-1][j-1];
res[i][i-j]=res[i][j];
}
}
return ;
}
long long cal4(int n,int m) {
long long answer=1;
for(int i=1; i<=m; i++) {
answer=answer*(n-m+i)/i;
}
return answer;
}
int main() {
int n,m;
while(cin>>n>>m) {
cal3(n,m);
cout<<res[n][m]<<endl;
cout<<cal4(n,m)<<endl;
}
return 0;
}

