Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
37852 LYLAKIOI 【BJ】T1 C++ 通过 100 508 MS 64436 KB 3002 2025-05-13 13:34:32

Tests(10/10):


#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int maxn=5e5+10,G=3,mod=998244353,Gi=(mod+1)/3; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } typedef vector<int> poly; int qp(int a,int b){ int res=1; while(b){ if(b&1)res=res*1ll*a%mod; a=a*1ll*a%mod;b>>=1; }return res; } inline int add(int x,int y){if((x+=y)>=mod)x-=mod;return x;} namespace Poly { int rev[1<<20],mul[1<<20]; void init(int n){ up(i,0,(1<<n)-1){ rev[i]=rev[i>>1]>>1; if(i&1)rev[i]|=1<<n-1; } } void NTT(int n,poly &a,int t){ init(n);up(i,0,(1<<n)-1)if(i<rev[i])swap(a[i],a[rev[i]]); for(int u=1;u<(1<<n);u<<=1){ int x=qp((t==1)?G:Gi,(mod-1)/u/2); mul[0]=1;up(i,1,u)mul[i]=mul[i-1]*1ll*x%mod; for(int i=0;i<(1<<n);i+=u*2){ up(j,i,i+u-1)if(a[j]||a[j+u]){ int x=a[j],y=a[j+u]*1ll*mul[j-i]%mod; a[j]=add(x,y),a[j+u]=add(x,mod-y); //a[j]=(x+y*1ll*mul[j-i]%mod)%mod; //a[j+u]=(x-y*1ll*mul[j-i]%mod+mod)%mod; } } } if(t==-1){ int x=qp(1<<n,mod-2); up(i,0,(1<<n)-1)a[i]=a[i]*1ll*x%mod; } } poly convolution(poly a,poly b){ int val=a.size()+b.size()-1; int n=1; while((1<<n)<=a.size()+b.size()+5)n++; while(a.size()<(1<<n))a.p_b(0); while(b.size()<(1<<n))b.p_b(0); NTT(n,a,1);//NTT(n,b,1); b=a; up(i,0,(1<<n)-1)a[i]=a[i]*1ll*b[i]%mod; NTT(n,a,-1); while(a.size()>val)a.pop_back(); return a; } } const int B=3; int n,m,cnt[maxn],ans[maxn]; vector<int>vec[B]; void slv(){ n=read(),m=read(); up(i,1,n){int x=read();++cnt[x];} vector<int>ve; up(i,1,m)if(cnt[i]>=B)ve.p_b(i); up(i,0,(int)ve.size()-1){ up(j,i+1,(int)ve.size()-1){ if(ve[i]+ve[j]>m)break; ans[ve[i]+ve[j]]+=min(cnt[ve[i]],cnt[ve[j]]); } } up(i,1,m)if(cnt[i]<B)vec[cnt[i]].p_b(i); poly x(m+1,0); for(int i:ve)x[i]=1; poly lst=Poly::convolution(x,x); down(i,B-1,1){ if(vec[i].empty())continue; for(int j:vec[i])x[j]=1; poly y=Poly::convolution(x,x); up(j,1,m){ ans[j]+=(y[j]-lst[j])/2*i; }lst=y; } up(i,1,m)if(!(i&1))ans[i]+=cnt[i/2]/2; up(i,1,m)printf("%d ",ans[i]); } int main(){ //freopen("a.in","r",stdin),freopen("a.out","w",stdout); slv(); return 0; }


测评信息: