2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 2 6 2 10 2 2 5 6 1 0 2 7 0 2 2 7 5 10 6 10 2 10 6 1 9
7 379297
解題思路:
這是一個母函數的題,因為ACM與CMA認為是同一個單詞,因為這是組合問題,所以這不是指數型的母函數。在下一篇博客中會詳細介紹一下關於普通型母函數的知識點。這裡就簡單的說幾句,就拿第一個例子來說吧,就拿第一個例子來說吧,我們可以這樣想因為A, B, C的字母只有一個而且他們的價值還不相同,A=1,B=2,C=3,所以我們可以組成的單詞可以是(1+X) * (1+X^2) * (1+X^3) == 1 + X + X^2 + 2*X^3 + X^4 + X^5 + X^6,所以價值不 小於50的就是 <=50的 X 的系數加起來, But沒有X^0前面的系數不需要,因為沒有字母就不是單詞,想明白這個之後就是寫程序了, 請看我的代碼:
My Code:
#includeusing namespace std; int c1[55];///每一次存的多項式中的數 int c2[55];///中間轉化變量 int arr[30];///輸入的價值數組 ///初始化 void Init() { for(int i=0; i<55; i++) { c1[i] = 0; c2[i] = 0; } } int main() { int n; cin>>n; while(n--) { Init(); for(int i=1; i<=26; i++) cin>>arr[i]; c1[0] = 1; for(int i=1; i<=26; i++)///一共26個多項式相乘 { for(int j=0; j<=50; j++)///指數最多是50 { for(int k=0; k<=arr[i] && k*i+j<=50; k++)///循環次數,k*i也是指數,就是多項式相乘 { c2[k*i+j] += c1[j]; } } for(int j=0; j<=50; j++)///c1才是系數 { c1[j] = c2[j]; c2[j] = 0; } } int ret = 0; for(int i=1; i<=50; i++)///指數是0的不算單詞 ret += c1[i]; cout<