题意:n个男生和m个女生选t个人,至少4男1女
提示:要用long long类型,不然会爆
方法一:直接排列组合
#include <stdio.h> #include <string.h> typedef long long ll; ll doo(ll i,ll n) { ll a=1; for(ll l=1;l<=i;l++) { a*=n-l+1; a/=l; //一边乘一边除,否则会爆,可以除尽的 } return a; } int main() { ll n,m,t; ll all; while(scanf("%I64d%I64d%I64d",&n,&m,&t)!=-1) { all=0; for(ll i=4;i<=t-1;i++) { if((t-i)>m) continue; if(i>n) break; //printf("%I64d %I64d %I64d %I64d\n",i,t-i,n,m); all+=doo(i,n)*doo(t-i,m); } printf("%I64d\n",all); } return 0; }方法二:因为数值小,可以用dp
#include <stdio.h> #include <string.h> typedef long long ll; ll dp[35][35]; int main() { ll n,m,t; ll all; dp[0][0]=0; for(int i=1;i<=30;i++) { dp[0][i]=1; dp[i][i]=1; } for(int i=1;i<=30;i++) for(int j=1;j<i;j++) dp[j][i]=dp[j-1][i-1]+dp[j][i-1]; while(scanf("%I64d%I64d%I64d",&n,&m,&t)!=-1) { all=0; for(int i=4;i<=t-1;i++) { if((t-i)>m) continue; if(i>n) break; all+=(dp[i][n]*dp[t-i][m]); } printf("%I64d\n",all); } return 0; }
dp[0][0]=0; for(int i=1;i<=30;i++) { dp[0][i]=1; dp[i][i]=1; } for(int i=1;i<=30;i++) for(int j=1;j<i;j++) dp[j][i]=dp[j-1][i-1]+dp[j][i-1];
The World is a Theatre codeforces131c
原文:http://blog.csdn.net/trq1995/article/details/44537879