題意: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];