Hdu 2082 找單詞 —— 母函式
阿新 • • 發佈:2021-01-25
技術標籤:數學
題意:
題解:
很明顯是一道DP,但是現在在學生成函數了就得用生成函式的思維去做題,每種字元可以取0~a[i]個,那麼算式可以寫成
∏
i
=
1
26
(
1
+
x
i
+
x
2
i
+
.
.
.
+
x
a
[
i
]
∗
i
)
\prod\limits_{i=1}^{26}(1+x^{i}+x^{2i}+...+x^{a[i]*i})
i=1∏26(1+xi+x2i+...+xa[i]∗i)
x的次方就代表價值,係數表示情況數
於是可以暴力了
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=105,M=26;
ll dp[2][N];
int a[M+5];
int main()
{
int t;
scanf("%d",&t);
while(t--){
for(int i=1;i<=M;i++)scanf("%d",&a[i]);
int f=0;
memset(dp[f],0,sizeof(dp[f]));
dp[f][0]=1;
int top=0;
for (int i=1;i<=M;i++){
int nt=min(top+a[i]*i,50);
memset(dp[f^1],0,sizeof(ll)*(nt+1));
for(int j=0;j*i<=nt&&j<=a[i];j++)
for(int k=0;k<=top&&k+j*i<=nt;k++)
dp[f^1][k+j*i]+=dp[f][k];
f^=1;
top= nt;
}
ll ans=0;
for(int i=1;i<=50;i++)
ans+=dp[f][i];
printf("%lld\n",ans);
}
return 0;
}