2 2 1 1
2
此题AB与BA属于不同的排列组合,故不应简单地用普通的生成函数,而应该用可以处理排列组合的指数型生成函数。公式及原理见转载的大牛博客。
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> using namespace std; int n,m; int num[10]; double a[100]; double b[100]; double fun(int s) { int i; double sum=1; for(i=2;i<=s;i++) sum*=i; return sum; } void Generating_function() { int i,j,k; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); a[0]=1; for(i=1;i<=n;i++) { for(j=0;j<=m;j++) { for(k=0;k<=num[i]&&k+j<=m;k++) b[k+j]+=a[j]*1.0/fun(k); } memcpy(a,b,sizeof(b)); memset(b,0,sizeof(b)); } } int main() { int i; while(~scanf("%d%d",&n,&m)) { for(i=1;i<=n;i++) scanf("%d",&num[i]); Generating_function(); printf("%0.lf\n",a[m]*fun(m)); } return 0; }