【母函数】hdu1028(Ignatius and the Princess III)

多项式乘法:(1+a1x)(1+a2x)……(1+anx)=1+(a1+a2+......+an)x+(a1a2+a1a3+......an-1an)x2+.......+a1a2a3...anxn可以看出x2项的系数a1a2+a1a3+...+an-1an中所有项包括n个元素,a1,a2.....an中的两个组合的全体,同理以此类推。

母函数定义:对于序列a0,a1,a2.....构造一函数:G(x)=a0+a1x+a2x2+....称函数G(x)是序列a0,a1,a2.....的母函数。

例:若有1克、2克、3克、4克的砝码各一 枚,能称出哪几种重量?各有几种可能方案?

如何解决这个问题呢?考虑构造母函数。如果用x的指数表示称出的重量,则:1个1克的砝码可以用函数1+x表示,1个2克的砝码可以用函数1+x2表示,1个3克的砝码可以用函数1+x3表示,1个4克的砝码可以用函数1+x4表示,几种砝码的组合可以称重的情况,可以用以上几个函数的乘积表示:(1+x)(1+x2)(1+x3)(1+x4)
=(1+x+x2+x3)(1+x3+x4+x7)
=1+x+x2+2x3+2x4+2x5+2x6+2x7+x8+x9+x10 从上面的函数知道:可称出从1克到10克,系数便是方案数。例如右端有2x5 项,即称出5克的方案有2:5=3+2=4+1;同样,6=1+2+3=4+2;10=1+2+3+4。故称出6克的方案有2,称出10克的方案有1  。

例:求用1分、2分、3分的邮票贴出不同数值的方案数?

因邮票允许重复,故母函数为:G(x)=(1+x+x2+,,,,)(1+x2+x4+.....)(1+x3+x6+,,,,,,)以展开后的x4为例,其系数为4,即4拆分成1、2、3之和的拆分数为4;
即 :4=1+1+1+1=1+1+2=1+3=2+2。

hdu1028

整数拆分:所谓整数拆分即把整数分解成若干整数的和(相当于把n个无区别的球放到n个无标志的盒子,盒子允许空,也允许放多于一个球)。
整数拆分成若干整数的和,办法不一,不同拆分法的总数叫做拆分数。 

import java.util.*;
class Main{
	public static void main(String args[]){
		Scanner sc=new Scanner(System.in);
		final int lmax=300;
		int[] c1=new int[lmax+1];
		int[]c2=new int[lmax+1];
		for(int i=0;i<lmax;i++){
			c1[i]=1;
		}
		for(int i=2;i<=120;i++){
			for(int j=0;j<=120;j++){//第一个多项式乘以第二多项式产生的k+j次方项的个数,也就是系数
				for(int k=0;k+j<=120;k+=i){//控制每次系数的变化和每个数出现的最大项数
					c2[k+j]+=c1[j];//k+j次方项的个数,从而得到k+j次方项的系数
				}
			}
			for(int j=0;j<=120;j++){
				c1[j]=c2[j];
				c2[j]=0;
			}
		}
		while(sc.hasNext()){
			int n=sc.nextInt();
			System.out.println(c1[n]);
		}
	}
}



你可能感兴趣的:(【母函数】hdu1028(Ignatius and the Princess III))