您的位置:首页 > 其它

8635 气球

2015-11-24 19:20 253 查看

8635 气球

该题有题解

时间限制:500MS 内存限制:1000K
提交次数:204 通过次数:58

题型: 编程题 语言: G++;GCC

Description

一天,OYY 从外面打完比赛回来,手上拿了很多个气球,颜色各不相同。他见到我,就说,你看,我拿了很多气球!
我膜拜死了!!然后他就问了我一个问题,如果把这里的气球分成若干份。有多少种分法呢?
由于我数学非常菜,顿时头晕了,因此希望大家能帮我解答这个问题(@_@))


输入格式

输入数据有2行
第1 行有两个数n,m,分别代表oyy 手上的气球个数和分的份数(n<=10,m<=5)
第2 行有m 个数,分别代表每一份的个数,保证总个数等于n


输出格式

输出数据有1行,输出一个数代表不同分法的总数。


输入样例

3 1
3


输出样例

1


提示

Sample Input2:
4 2
2 2
Sample Output2:
3


来源

Ick2

作者

admin
运用数学的平均分配原则,数据数组结尾没有'\0'

#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,m,a[5],b[15]={0},i,j,x,top;
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
{scanf("%d",&a[i]);b[a[i]]+=1;}
/*for(i=0;i<m;i++)
printf("%d ",a[i]);
printf("\n");*/

int sum1=1;
for(i=0;i<m;i++)
{
top=a[i];
for(j=0;j<top;j++)
sum1=sum1*(n-j);

n=n-a[i];
}
for(i=0;i<m;i++)
{
top=a[i];
for(j=0;j<top;j++)
sum1=sum1/(top-j);
n=n-a[i];
}

for(i=0;i<m;i++)
{
for(j=i+1;j<m;j++)
{
if(a[j]==a[i])
{a[j]=0;
continue;}
}
}

x=0;
for(i=0;i<m;i++)
{
if(a[i]==0)
{
i++;
continue;
}
else
{
a[x]=a[i];
x++;
i++;}
}

/*for(i=0;i<x;i++)
printf("%d ",a[i]);
printf("\n");*/

int sum2=1;
for(i=0;i<x;i++)
{

for(j=0;j<b[a[i]];j++)
{
sum2=sum2*(b[a[i]]-j);
}
}

printf("%d",sum1/sum2);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: