codeforces #250E The Child and Binary Tree 快速傅里叶变换

题目大意:给定一个集合 构造答案多项式,那么 根节点的左子树是一棵二叉树,右子树是一棵二叉树,本身的权值必须在集合S中,此外还有空树的情况 故有 解得 若等式下方取减号则分母不可逆,舍去 得到 有关多项式求逆和多项式开根的内容参见Picks的博客 CF上每个点7s时限能过 BZ上我实在没心情卡常数了 [捂脸熊]我整个人都快速傅里叶变换了

;int n,m,l;int a[M],b[M];x,long long y){long long re=1;while(y){if(y&1) (re*=x)%=P;(x*=x)%=P; y>>=1;}return re;}void FFT(int a[],int n,int type){static int temp[M];int i;if(n==1) return ;for(i=0;i<n;i+=2)temp[i>>1]=a[i],temp[i+n>>1]=a[i+1];memcpy(a,temp,sizeof(a[0])*n);int *l=a,*r=a+(n>>1);FFT(l,n>>1,type);FFT(r,n>>1,type);)(P-1)/n*type%(P-1)),wn=1;for(i=0;i<n>>1;i++,(wn*=w)%=P)temp[i]=(l[i]+wn*r[i])%P,temp[i+(n>>1)]=(l[i]-wn*r[i]%P+P)%P;memcpy(a,temp,sizeof(a[0])*n);}void Get_Inv(int a[],int b[],int n){static int temp[M];int i;if(n==1){b[0]=Quick_Power(a[0],P-2);return ;}Get_Inv(a,b,n>>1);memcpy(temp,a,sizeof(a[0])*n);memset(temp+n,0,sizeof(a[0])*n);FFT(temp,n<<1,1);FFT(b,n<<1,1);for(i=0;i<n<<1;i++)temp[i]=()temp[i]*b[i]%P+P)%P;FFT(temp,n<<1,P-2);long long inv=Quick_Power(n<<1,P-2);for(i=0;i<n;i++)b[i]=temp[i]*inv%P;memset(b+n,0,sizeof(a[0])*n);}void Get_Root(int a[M],int b[M],int n)//0-ori 1-inv{static int temp[M],b_inv[M];int i;if(n==1){b[0]=1;return ;}Get_Root(a,b,n>>1);memset(b_inv,0,sizeof(a[0])*n);Get_Inv(b,b_inv,n);memcpy(temp,a,sizeof(a[0])*n);memset(temp+n,0,sizeof(a[0])*n);FFT(temp,n<<1,1);FFT(b,n<<1,1);FFT(b_inv,n<<1,1);for(i=0;i<n<<1;i++)temp[i]=()temp[i]*b_inv[i]%P)%P;FFT(temp,n<<1,P-2);long long inv=Quick_Power(n<<1,P-2);for(i=0;i<n;i++)b[i]=temp[i]*inv%P;memset(b+n,0,sizeof(a[0])*n);}int main(){int i,x;cin>>n>>m;for(l=1;l<=m;l<<=1);for(i=1;i<=n;i++){scanf(“%d”,&x);if(x<=m) a[x]-=4;if(a[x]<0) a[x]+=P;}a[0]=1;Get_Root(a,b,l);static int c[M],d[M];memcpy(c,b,sizeof(a[0])*l);(++c[0])%=P;Get_Inv(c,d,l);for(i=1;i<=m;i++)printf(“%d\n”,(d[i]<<1)%P);return 0;}

,送给中意的TA,背面写上:某年某月某日,

codeforces #250E The Child and Binary Tree 快速傅里叶变换

相关文章:

你感兴趣的文章:

标签云: