一典型的排列问题,不过只需要给出具体的排列的数就可以了,不需要给出具体的排列!数据不是很大,就直接算吧!
#include <iostream>
#include <string.h>
#define NUM1 26+1
#define MAX 400
using namespace std;
int all[MAX];
void mul(int sum)
{
int i,j;
int carry;
memset(all,0,sizeof(all));
all[0]=1;
for(i=1;i<=sum;i++)
{
carry=0;
for(j=0;j<MAX;j++)
{
all[j]=all[j]*i+carry;
carry=0;
if(all[j]>10)
{
carry=all[j]/10;
all[j]%=10;
}
}
}
return ;
}
int mul1(int m)
{
int i,sum=1;
for(i=1;i<=m;i++)
sum*=i;
return sum;
}
void div(int *all,int a)
{
int i;
long long int quotient=0;
for(i=MAX-1;i>=0;i--)
if(all[i]!=0)
break;
for(;i>=0;i--)
{
quotient =quotient*10 + all[i];
all[i] = quotient/a;
quotient %= a;
}
return ;
}
int main()
{
int m,sum;
int a[NUM1];
while(cin>>m,m)
{
int i;
sum=0;
memset(a,0,sizeof(a));
for(i=1;i<=m;i++)
{
cin>>a[i];
sum+=a[i];
}
mul(sum);
for(i=1;i<=m;i++)
{
div(all,mul1(a[i]));
}
for(i=MAX-1;i>=0;i--)
if(all[i]!=0) break;
for(;i>=0;i--)
cout<<all[i];
cout<<endl;
}
return 0;
}
这里涉及到了,大数的阶乘,和大数除以一个小数的思路!可以细细体会一下!