题解:P13843 集合幂级数 exp(非素数模数)
首先我们阅读 Purslane 大神的题解得知,集合幂级数 exp 的意思是
我们容易写出
我们按照
注意到子集卷积也是使用的
cin>>n;
repn(i,1<<n)cin>>t[i];
repn(i,1<<n)a[i][popc(i)]=t[i];
repn(h,n)repn(i,1<<n)if((i>>h&1)&&(1<<h+1)<i)rep(j,0,n)a[i][j]+=a[i-(1<<h)][j];
rep(c,1,n){
repn(i,1<<n)w[i]=f[i][c];
repn(h,n)repn(i,1<<n)if((i>>h&1)&&(1<<h+1)<i)w[i]-=w[i-(1<<h)];
repn(i,1<<n)if(popc(i)==c)e[i]=w[i]+=t[i];
repn(h,n)repn(i,1<<n)if(i>>h&1)w[i]+=w[i-(1<<h)];
repn(i,1<<n)rep(j,1,n-c)f[i][j+c]+=w[i]*a[i][j];
}
e[0]=1;repn(i,1<<n)cout<<e[i]<<' ';cout<<'\n';
同理,本算法也会对集合幂级数 ln 表示支持。作为 exp 的逆运算,显然有
cin>>n;
repn(i,1<<n)cin>>t[i];
repn(i,1<<n)a[i][popc(i)]=t[i];
repn(h,n)repn(i,1<<n)if(i>>h&1)rep(j,0,n)a[i][j]+=a[i-(1<<h)][j];
rep(c,1,n){
repn(i,1<<n)w[i]=f[i][c];
repn(h,n)repn(i,1<<n)if((i>>h&1)&&(1<<h+1)<i)w[i]-=w[i-(1<<h)];
repn(i,1<<n)if(popc(i)==c)e[i]=w[i]=t[i]-w[i];
repn(h,n)repn(i,1<<n)if((i>>h&1)&&(1<<h+1)<i)w[i]+=w[i-(1<<h)];
repn(i,1<<n)rep(j,1,n-c)f[i][j+c]+=w[i]*a[i][j];
}
repn(i,1<<n)cout<<e[i]<<' ';cout<<'\n';