本文主要是介绍HDU -1261 组合数学。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这题的的公式很好推。
先在m个数里进行全排列。由于有相同的,那么就要除去每个相同个数的阶乘。
故有公式:A=(a+b+c+d+........)!/(a! *b! *c! *d!.........)
另外这是个大数,需要用到高精度了。
#include<stdio.h>
int num[250],a[30];
int n,len;void solve(int m)
{int carry,tmp,i,j,k;len=1,num[0]=1;for(i=2;i<=m;i++){ //求阶乘,模拟乘法。 carry=0; for(j=0;j<len;j++){tmp=num[j]*i+carry;num[j]=tmp%1000;carry=tmp/1000;}if(carry) num[len++]=carry;}for(i=0;i<n;i++){ //除法。 for(j=2;j<=a[i];j++){carry=0;for(k=len-1;k>=0;k--){tmp=num[k]+carry*1000;num[k]=tmp/j;carry=tmp%j;}while(num[len-1]==0) len--;}}
}int main()
{int sum,i;while(scanf("%d",&n)&&n){sum=0;for(i=0;i<n;i++){scanf("%d",&a[i]);sum+=a[i];}solve(sum);printf("%d",num[len-1]); for(i=len-2;i>=0;i--)printf("%03d",num[i]); //注意格式,输出一个数代表的是三位。而足三位的就没必要补零。 printf("\n");}return 0;
}
这篇关于HDU -1261 组合数学。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!