多项式卷积板子

用于求类似在n组水果,每组水果只能拿[ai,bi]个,最后一共拿m个的方案

或者拥有几枚1,2,5分硬币不能表示的最小分

//用x^m项的系数表示组合数 
int n,m;
int c[200],d[200],a[200],b[200];
//第i个多项式:x^ai+x^(ai+1)......x^bi 
int cal(){
	for(int i=0;i<=m;i++)c[i]=d[i]=0;//c,d为系数数组 
	for(int i=a[1];i<=b[1];i++)c[i]=1;//x^a1+x^a2+....x^b1(首个多项式) 
	
	for(int i=2;i<=n;i++){
		//第i个生成函数(多项式) 
		for(int j=0;j<=m;j++){
			//1+x+x^2+x^3....+x^m(大于m的无法卷积得到x^m) 
			//表示首个多项式(1+x+x^2.....x^m)(前面一些项系数可能是0) 
			for(int k=a[i];k<=b[i];k++){
				//表示第i个多项式 (x^ai) 分别乘以 (1+x+x^2+..x^m) 
				d[j+k]+=c[j];
				//得到项的系数 
			}
		}	
		for(int j=0;j<=m;j++){
			c[j]=d[j];d[j]=0;
			//两个多项式卷积得到的系数 
		}
	}
	return c[m];
}
posted @ 2025-03-30 17:04  Marinaco  阅读(16)  评论(0)    收藏  举报
//雪花飘落效果