HDU1028整数拆分母函数

HDU1028整数拆分母函数
http://acm.hdu.edu.cn/showproblem.php?pid=1028

之前用dp做了整数分解,这次学了母函数,用母函数更加方便。理解母函数不难,难在模拟多项式相乘。
首先写成母函数,然后根据该母函数表达式模拟多项式乘法。

// 母函数整数拆分
#include  < iostream >

using   namespace  std;

const   int  M = 121 ;
int  a[M];  // 存储上一次的系数
int  b[M];  // 存储这次运算完的系数


int  main()
{
    
int  n,i,j,k;
    
while (scanf( " %d " , & n) != EOF)
    {
        
for (i = 0 ;i <= n;i ++ )
        {
            a[i]
= 1 // 保存上一个表达式的系数,作为上一个表达式的系数
            b[i] = 0 // 保存上一个表达式和这次的表达式相乘后的系数,初始化为0
        }
        
for (i = 2 ;i <= n;i ++ ) // 这次的表达式是指第i个表达式,上一个表达式是指前i-1个表达式相乘后的最终表达式
                         
// 第i个表达式的增量为i
        {                 // 所谓上一个表达式的结构是a0*x^0+a1*x^1+a2*x^2+a3*x^3++aj*x^j++an*x^n
             for (j = 0 ;j <= n;j ++ )        // j是上一个表达式的指数
                 for (k = 0 ;k + j <= n;k += i) // k是这一次表达式的指数,增量是i
                    b[j + k] += a[j];    // 相乘的过程
             for (j = 0 ;j <= n;j ++ )
            {
                a[j]
= b[j]; // 将相乘之后的系数,赋给a数组,作为上一次表达式的系数,为下一个循环用(如果还有的话)
                b[j] = 0 ;    // 每次都要初始化,为了保存下一次的系数
            }
        }
        printf(
" %d\n " ,a[n]);
    }
    
return   0 ;
}

母函数形式:


你可能感兴趣的:(HDU1028整数拆分母函数)