P11152 七彩序列 题解
考虑
要注意本题其实并没有所有
代码写得很难看……
//省略多项式板子
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",l+i);
sort(l+1,l+1+n);m=l[1];
assert(l[1]==l[n]);
default_shrink=m+1;
poly p_upper,p_lower,p,ans;
for(int i=1;i<=m;i++){
int siz=0;mi cur=1;
for(int j=1;j<=n;j++){
siz+=i;cur=cur*rfac[i];
}
p[i]=-cur*fac[siz];
}
for(int i=0;i<=m;i++){
int siz=0;mi cur=1;
for(int j=1;j<=n;j++){
siz+=l[j]-m+i;cur=cur*rfac[l[j]-m+i];
}
p_upper[i]=-cur*fac[siz];
}
for(int i=0;i<=m;i++){
int siz=0;mi cur=1;
for(int j=n;j>=1;j--){
if(i-l[j]+m<0){cur=0;break;}
siz+=i-l[j]+m;cur=cur*rfac[i-l[j]+m];
}
p_lower[i]=-cur*fac[siz];
}
poly p1;p1[0]=1;
p_upper=p_upper*ginv(p1-p);
p_lower=p_lower*ginv(p1-p);
poly p_conclusion=p_upper*p_lower;
ans=ginv(p1-p)*p_upper*ginv(p1-p_conclusion);
printf("%d",(-(ans[m])).w);
}