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
相关文章推荐
- BZOJ 3625: [Codeforces Round #250]小朋友和二叉树 dp 生成函数 多项式开根
- BZOJ 3625 [Codeforces Round #250]小朋友和二叉树 ——NTT 多项式求逆 多项式开根
- BZOJ 3625: [Codeforces Round #250]小朋友和二叉树
- 【BZOJ3625/CF438E】小朋友和二叉树(多项式求逆,多项式开方)
- BZOJ 3625: [Codeforces Round #250]小朋友和二叉树
- BZOJ3625: [Codeforces Round #250]小朋友和二叉树
- [Codeforces438E][bzoj3625] 小朋友和二叉树 [多项式求逆+多项式开根]
- bzoj-3625 小朋友和二叉树
- [多项式开根 模板题] BZOJ 3625 [Codeforces Round #250]小朋友和二叉树
- BZOJ 3625 小朋友和二叉树(生成函数+FFT)
- BZOJ3625 [Codeforces Round #250]小朋友和二叉树(生成函数+多项式开根)
- [BZOJ3625][Codeforces Round #250][多项式求逆][多项式开根]小朋友和二叉树
- [BZOJ3625]小朋友和二叉树
- bzoj 3625 小朋友和二叉树 多项式开根
- bzoj 3625小朋友和二叉树 多项式求逆+多项式开根 好题
- BZOJ 3625 [Codeforces Round #250]小朋友和二叉树 多项式开根
- 【BZOJ3625】【CF438E】小朋友和二叉树 NTT 生成函数 多项式开根 多项式求逆
- [bzoj 3625][Codeforces Round #250]小朋友和二叉树 NTT多项式求逆+多项式开根
- 【BZOJ3625/CF438E】小朋友和二叉树(多项式求逆,多项式开方)
- 3625: [Codeforces Round #250]小朋友和二叉树