您的位置:首页 > 其它

bzoj3625 [Codeforces Round #250]小朋友和二叉树

2017-03-14 21:03 274 查看

传送门

终于学会多项式开根了哈哈……

反正题解都烂大街了,我就不写了,直接贴代码算了……(犯懒ing)

/**************************************************************
Problem: 3625
User: _Angel_
Language: C++
Result: Accepted
Time:29048 ms
Memory:5944 kb
****************************************************************/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=262200,p=998244353,g=3,inv_2=499122177;
void NTT(int*,int,int);
void getsqrt(int*,int*,int);
void getinv(int*,int*,int);
int qpow(int,int,int);
int n,N=1,m,x,A[maxn],B[maxn];
int main(){
scanf("%d%d",&m,&n);
while(N<=n)N<<=1;
while(m--){
scanf("%d",&x);
A[x]=(A[x]-4+p)%p;
}
A[0]=(A[0]+1)%p;
getsqrt(A,B,N);
B[0]=(B[0]+1)%p;
getinv(B,A,N);
for(int i=1;i<=n;i++)printf("%d\n",(int)(A[i]*2ll%p));
return 0;
}
void NTT(int *A,int n,int tp){
for(int i=1,j=0,k;i<n-1;i++){
k=n;
do j^=(k>>=1);while(j<k);
if(i<j)swap(A[i],A[j]);
}
for(int k=2;k<=n;k<<=1){
int wn=qpow(g,(tp>0?(p-1)/k:(p-1)/k*(long long)(p-2)%(p-1)),p);
for(int i=0;i<n;i+=k){
int w=1;
for(int j=0;j<(k>>1);j++,w=(long long)w*wn%p){
int a=A[i+j],b=(long long)w*A[i+j+(k>>1)]%p;
A[i+j]=(a+b)%p;
A[i+j+(k>>1)]=(a-b+p)%p;
}
}
}
if(tp<0){
int inv=qpow(n,p-2,p);
for(int i=0;i<n;i++)A[i]=(long long)A[i]*inv%p;
}
}
void getsqrt(int *A,int *C,int n){
static int B[maxn],D[maxn];
fill(C,C+(n<<1),0);
C[0]=1;
for(int k=2;k<=n;k<<=1){
copy(A,A+k,B);
fill(B+k,B+(k<<1),0);
getinv(C,D,k);
NTT(B,k<<1,1);
NTT(D,k<<1,1);
for(int i=0;i<(k<<1);i++)B[i]=(long long)B[i]*D[i]%p;
NTT(B,k<<1,-1);
for(int i=0;i<k;i++)C[i]=(C[i]+B[i])%p*(long long)inv_2%p;
}
}
void getinv(int *A,int *C,int n){
static int B[maxn];
fill(C,C+(n<<1),0);
C[0]=qpow(A[0],p-2,p);
for(int k=2;k<=n;k<<=1){
copy(A,A+k,B);
fill(B+k,B+(k<<1),0);
NTT(B,k<<1,1);
NTT(C,k<<1,1);
for(int i=0;i<(k<<1);i++)C[i]=C[i]*((2-(long long)B[i]*C[i]%p+p)%p)%p;
NTT(C,k<<1,-1);
fill(C+k,C+(k<<1),0);
}
}
int qpow(int a,int b,int p){
int ans=1;
for(;b;b>>=1,a=(long long)a*a%p)if(b&1)ans=(long long)ans*a%p;
return ans;
}
View Code

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: