Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
24570 | liuyile | 【BJ】T1 | C++ | 运行超时 | 80 | 1000 MS | 29812 KB | 2376 | 2024-01-02 18:12:48 |
#include <bits/stdc++.h> //#define int long long #define endl "\n" using namespace std; namespace fast_io{ const int N=1<<21,C=sizeof(char); char buf[N],*s,*t; #define getchar() (s==t&&(t=fread(s=buf,C,N,stdin)+buf),s==t?EOF:*s++) #define gc() getchar() inline int rd(){ int res=0,x=gc(); while(x<'0'||x>'9')x=gc(); while(!(x<'0'||x>'9')) res=res*10+x-48,x=gc(); return res; } } using fast_io::rd; const int M=998244353,G=3,iG=(M+1)/3; int rev[(1<<20)+10]; inline int qp(int a,int x){ int res=1; while(x){ if(x&1)res=1ll*res*a%M; a=1ll*a*a%M; x>>=1; } return res; } inline int inv(int x){return qp(x,M-2);} const int N=1<<20,IVN=inv(N),K=20; int AG[(1<<20)+10],AIG[(1<<20)+10]; inline void NTT(int *f,int *g){ for(int i=0;i<N;i++)if(rev[i]>i)swap(f[i],f[rev[i]]); for(int len=2;len<=N;len<<=1) for(int t=0,L=len/2,dwg=g[len];t<N;t+=len) for(int j=t,buf=1;j<t+L;j++){ int a=f[j],b=1ll*f[j+L]*buf%M; f[j]=(a+b),f[j+L]=(a-b+M)%M; if(f[j]>=M)f[j]-=M; if(f[j+L]>=M)f[j+L]-=M; buf=1ll*buf*dwg%M; } if(g==AIG)for(int i=0;i<N;i++)f[i]=1ll*f[i]*IVN%M; } inline void init(){ for(int i=0;i<N;i++)if(i&1)rev[i]=(rev[i>>1]>>1)|(1<<K-1);else rev[i]=rev[i>>1]>>1; for(int len=2;len<=N;len<<=1) AG[len]=qp(G,(M-1)/len), AIG[len]=qp(iG,(M-1)/len); } int f[(1<<20)+10],g[(1<<20)+10]; int ANS[(1<<20)+10]; inline void TIMES(int *f,int *g){ NTT(f,AG),NTT(g,AG); for(int i=0;i<N;i++)ANS[i]=(ANS[i]+1ll*f[i]*g[i])%M; //NTT(f,iG),NTT(g,iG); memset(f,0,N*sizeof(int)); memset(g,0,N*sizeof(int)); } int n,m; vector<int>BG; int q[500400]; const int T=2; signed main(){ ios::sync_with_stdio(0); // freopen("a.in","r",stdin); // freopen("a.out","w",stdout); init(); n=rd(),m=rd(); for(int i=1;i<=n;i++){ int x=rd(); q[x]++; } for(int i=1;i<=m;i++) if(q[i]>T) BG.push_back(i); for(int x=1;x<=T;x++){ //cout<<x<<" "; //cout.flush(); for(int i=1;i<=m;i++) f[i]=(x==q[i])*q[i],g[i]=(x<=q[i]); TIMES(f,g); for(int i=1;i<=m;i++) f[i]=(x==q[i])*q[i],g[i]=(x<q[i]); TIMES(f,g); } // for(int i=0;i<N;i++) // ANS[i]%=M; NTT(ANS,AIG); for(int x:BG) for(int y:BG) ANS[x+y]+=min(q[x],q[y]); for(int i=1;i<=m;i++) cout<<ANS[i]/2<<" "; cout.flush(); return 0; }