HDU2082 找单词
问题分析
不难想到用母函数做。
令自变量\(x\)的次数就是单词价值,那么答案就是\(x\)的\(1\)次到\(50\)次的系数之和。由于我们只需要处理前\(51\)项,所以暴力多项式相乘即可。
举个例子,第一组样例的母函数就是:
\[G(x)=(1+x)(1+x^2)(1+x^3)=1+x+x^2+2x^3+x^4+x^5+x^6
\]
出去\(x\)的\(0\)次项系数的和就是\(7\)。
参考程序
#include <bits/stdc++.h>
using namespace std;
void Work();
int main() {
int TestCases = 0;
scanf( "%d", &TestCases );
for( ; TestCases--; ) Work();
return 0;
}
int A[ 110 ], B[ 110 ], C[ 110 ];
void Work() {
memset( A, 0, sizeof( A ) );
A[ 0 ] = 1;
for( int i = 1; i <= 26; ++i ) {
memset( B, 0, sizeof( B ) );
int k; scanf( "%d", &k );
B[ 0 ] = 1;
for( int j = 1; j * i <= 50 && j <= k; ++j )
B[ j * i ] = 1;
memset( C, 0, sizeof( C ) );
for( int j = 0; j <= 50; ++j )
for( int k = 0; k <= 50; ++k )
if( j + k <= 50 )
C[ j + k ] += A[ j ] * B[ k ];
memcpy( A, C, sizeof( A ) );
}
int Ans = 0;
for( int i = 0; i <= 50; ++i ) Ans += A[ i ];
printf( "%d\n", Ans - 1 );
return;
}