多项式卷积板子
用于求类似在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];
}

浙公网安备 33010602011771号