原題:HDU-1261
n種字母排序總共有n!種不同的排法
假如字母B有m個,則字母B1,B2,B3...Bm一共有m!種排法
題目中說要去掉重複的
所以剩下的方法數量爲 n!/m!
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int gcd(int a,int b) {
if(b==0) return a;
else return gcd(b,a%b);
}
int main() {
int n,a[30],sum[501];//sun儲存結果
int s2[400],b[27][15];//存儲i便於計算
while(cin>>n&&n) {
int i,j,k;
int s=0;
for(i=1; i<=n; i++) {
cin>>a[i];
s+=a[i];
}
for(i=1; i<=s; i++) { //記錄所有個數
s2[i]=i;
}
for(k=1; k<=n; k++) {
for(j=2; j<=a[k]; j++) {
int m=j;
while(m>1) {
for(i=1; i<=s; i++) {
int m1=gcd(s2[i],m);
m=m/m1;
s2[i]=s2[i]/m1;
}
}
}
}
memset(sum,0,sizeof(sum));
sum[0]=1;
for(i=1; i<=s; i++) { //模擬相乘沒有約去的值
int flag=0;
if(s2[i]!=1)
for(j=0; j<=500; j++) {
int ss=sum[j]*s2[i]+flag;
sum[j]=ss%10;
flag=ss/10;
}
}
for(i=500; !sum[i]; i--);
for(j=i; j>=0; j--) {
cout<<sum[j];
}
cout<<endl;
}
return 0;
}