1. 程式人生 > 其它 >Hdu 2082 找單詞 —— 母函式

Hdu 2082 找單詞 —— 母函式

技術標籤:數學

This way

題意:

在這裡插入圖片描述

題解:

很明顯是一道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=126(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; }