题目链接:排列组合
题目大意:中文题
思路:指数型母函数模板。
有关指数型母函数的详解:
先看:百度百科的讲解,再看博客:指数型母函数。
代码:
#include<stdio.h>
#include<string.h>
typedef long long ll;
const int maxn=20;
ll a[maxn],b[maxn],n_jie[maxn];
int main()
{
int n,m;
n_jie[0]=1;
for(int i=1; i<=11; i++)//记录各个位置的阶乘数
n_jie[i]=n_jie[i-1]*i;
while(~scanf("%d%d",&n,&m))
{
memset(a,0,sizeof(a));
int y;
a[0]=1;
for(int i=0; i<n; i++)//指数型母函数模板
{
scanf("%d",&y);
memset(b,0,sizeof(b));
for(int j=0; j<=m; j++)
{
for(int k=0; k+j<=m&&k<=y; k++)
b[k+j]+=a[j]*n_jie[k+j]/n_jie[k]/n_jie[j];
}
for(int j=0; j<=m; j++)
a[j]=b[j];
}
printf("%lld\n",a[m]);
}
return 0;
}