开会
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
0
-
描述
-
在南阳理工学院,经常会在小礼堂举办活动、开大型会议,多数情况下都是从每个班里抽出一部分人去代表班级,但是也不排除会让全班一起去的时候。每次只确定了去的人数,没有规定要某某同学去。为了公平起见,一个同学不会去两次,那么每次都有多少种去的方案呢。
假设这个班级总共S个人,这一学期一共要在小礼堂开n次会议,每次去小礼堂的人数为Mi,那么对于每次会议有多少种去的方案呢?(保证n次去的总人数不超过班级总人数)
-
输入
-
多组测试数据。
每组数据第一行两个整数S,n;(0<S<18,0<n<10)
第二行n个数(M1,M2......Mn)(0<Mi<10);
输出
- 每组数据输出一行,n个数,代表每次去小礼堂的方案种数。
-
多组测试数据。
10 2 1 1 12 3 2 1 1
10 9 66 10 9
每次找到去的数量后,把去过的除去,下一次从没去过的人里面选..
比较简单的一道排列组合的题...注意看题,基本上没有难度,简单的公式处理就可以了............
签到题有没有~~
#include<stdio.h>
long long s[25];
int n,m,x[55];
void db()
{
s[0]=1;
for(int i=1;i<20;++i)
{
s[i]=s[i-1]*i;//先把全排的结果写出来(阶乘)
}
}
void slove()
{
for(int i=0;i<m;++i)
{
if(i)
{
printf(" ");
}
long long tp=s[n]/s[n-x[i]]/s[x[i]];//每次求出种类数
n-=x[i];//注意去过的不能再去了........
printf("%lld",tp);
}
printf("\n");
}
int main()
{
db();
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<m;++i)
{
scanf("%d",x+i);
}
slove();
}
return 0;
}