ACM组队安排
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1051 Accepted Submission(s): 512
Problem Description
ACM亚洲区比赛结束,意味着开始备战明年的浙江省大学生程序设计竞赛了!
杭州电子科技大学ACM集训队也准备开始组队。
教练想把所有的n个队员组成若干支队伍,原则是每支队伍至少一人,最多三人。
现在问题来了:如果已知集训队队员的数量n,请你帮教练计算出所有可能的组队方案有多少种。
特别说明:
队伍没有编号,即如果有A,B,C三人,{A}{BC}与{BC}{A}是同一种组队情况。
Input
输入包含多组测试数据(约1000组),每组数据占一行,包含一个数字n(0<=n<=20),表示ACM集训队的队员人数;n为0,表示输入结束。
Output
请输出n个队员所有可能的组队方案数,每组输出占一行。
Sample Input
1
2
3
4
5
0
Sample Output
1
2
5
14
46
数学题。打了一发表
#include"cstring"
#include"string.h"
#include"iostream"
#include "cstdio"
#include "cmath"
using namespace std;
typedef unsigned uint;
uint CC(uint n, uint r)
{
uint Anr = 1;
uint Arr = 1;
for(; r > 0; Anr *= n--, Arr *= r--);
return Anr / Arr;
}
int AA(int a)
{
int temp=1;
while(a>=1)
{
temp*=a;
a--;
}
return temp;
}
int main()
{
int people=1;
long long ans=0;
int cnt=1;
long long store[25];
for(;people<=20;people++)
{
ans=0;
for(int i=0;i<=people;i++)
{
for(int j=0;j<=people;j++)
{
for(int k=0;k<=people;k++)
{
if(3*i+2*j+k==people)
{
int total=people;
total=people;
long long ans1=1,ans2=1,ans3=1;
if(i>=1)
ans1=1;
if(j>=1)
ans2=1;
for(int o=1;o<=i;o++)
{
ans1*=CC(total,3);
total-=3;
}
for(int o=1;o<=j;o++)
{
ans2*=CC(total,2);
total-=2;
}
if(i==0&&j==0&&k>=1)
{
ans++;
continue;
}
ans+=ans1/AA(i)*ans2/AA(j)*ans3;
}
}
}
}
//printf("people:%d %lld\n",people,ans);
store[cnt++]=ans;
}
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
return 0;
printf("%lld\n",store[n]);
}
}