问题原型:
n个元素组成的多重集,其中a1重复了n1次,a2重复了n2次......ak重复了nk次,若 n=n1+n2+...+nk 从n个元素取出r个排列,求不同的排列数。
公式:
HDU1521 为例的模板:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int fac[]={1,1,2,6,24,120,720,5040,40320,362880,3628800};
double x[11],y[11],a[11];
int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=0;i<=m;i++){
x[i]=y[i]=0.0;
}
for(int i=0;i<n;i++){
scanf("%lf",&a[i]);
}
for(int i=0;i<=a[0];i++){
x[i]=1.0/fac[i];
}
for(int i=1;i<n;i++){
for(int j=0;j<=m;j++){
for(int k=0;k+j<=m&&k<=a[i];k++){
y[j+k]+=(x[j]/fac[k]);
}
}
for(int j=0;j<=m;j++){
x[j]=y[j];
y[j]=0;
}
}
printf("%.0f\n",x[m]*1.0*fac[m]);
}
return 0;
}