1. 程式人生 > 其它 >Hdu 1521 排列組合 —— 指數型母函式

Hdu 1521 排列組合 —— 指數型母函式

技術標籤:數學

This way

題意:

在這裡插入圖片描述

題解:

普通母函式是求組合問題,指數型母函式是求排列問題。那麼這道題的函式為:
∏ i = 1 n ( 1 + x + x 2 2 ! + . . . + x a [ i ] a [ i ] ! ) \prod\limits_{i=1}^{n}(1+x+\frac{x^2}{2!}+...+\frac{x^{a[i]}}{a[i]!}) i=1n(1+x+2!x2+...+a[i]!xa[i])
其實和普通母函式差不多

#include<bits/stdc++.h>
using namespace std;
#define
ll long long
const int N=15; ll fac[N],dp[2][N]; int a[N]; int main() { fac[0]=1; for(int i=1;i<N;i++)fac[i]=fac[i-1]*i; int n,m; while(~scanf("%d",&n)){ scanf("%d",&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]
); int f=0; memset(dp[f],0,sizeof(dp[f])); int top=0; dp[f][0]=1; for(int i=1;i<=n;i++){ int nt=min(m,top+a[i]); memset(dp[f^1],0,sizeof(ll)*(nt+1)); for(int j=0;j<=nt&&j<=a[i];j++) for(int k=0;k<=
top&&k+j<=nt;k++) dp[f^1][j+k]+=dp[f][k]*fac[j+k]/fac[j]/fac[k]; f^=1,top=nt; } printf("%lld\n",dp[f][m]); } return 0; }