Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
37855 LYLAKIOIAKIOI 【BJ】T1 C++ 解答错误 80 669 MS 28544 KB 2412 2025-05-13 14:37:27

Tests(8/10):


#include<bits/stdc++.h> #define pii pair<int,int> #define mk make_pair #define fi first #define se second using namespace std; const int N=2.2e6,mod=998244353,g=3; int getlen(int len){ int LEN=2; while(LEN<len) LEN*=2; return LEN; } #define poly vector<int> int rev[N]; void updpos(poly &x){ int len=x.size(); for(int i=0;i<len;i++){ rev[i]=rev[i/2]/2; if(i&1) rev[i]+=len/2; }for(int i=1;i<=len;i++){ if(i<rev[i]) swap(x[i],x[rev[i]]); } }//len=2^k int qp(int a,int b){ int x=1; while(b){ if(b&1) x=1ll*x*a%mod; a=1ll*a*a%mod;b>>=1; }return x; } void NTT(poly &x,int op){ updpos(x); int len=x.size(); for(int le=1;le<len;le*=2){ int bs=(op==1)?g:qp(g,mod-2); int step=qp(bs,(mod-1)/le/2); for(int l=0;l<len;l+=le*2){ int o=1; for(int i=0;i<le;i++){ int gx=x[l+i],hx=1ll*x[l+i+le]*o%mod; x[l+i]=(gx+hx)%mod; x[l+i+le]=(gx-hx+mod)%mod; o=1ll*o*step%mod; } } } } poly operator*(const poly &a,const poly &b){ poly res,t1,t2; int len=getlen(a.size()+b.size()-1); for(int i=0;i<len;i++){ if(i<a.size()) t1.push_back(a[i]); else t1.push_back(0); if(i<b.size()) t2.push_back(b[i]); else t2.push_back(0); }NTT(t1,1);NTT(t2,1); for(int i=0;i<len;i++){ res.push_back(1ll*t1[i]*t2[i]%mod); }NTT(res,-1); for(int i=0;i<len;i++){ res[i]=1ll*res[i]*qp(len,mod-2)%mod; } return res; } int n,m,a[N],v[N<<1]; const int B=2; int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ int x;cin>>x;a[x]++; } for(int i=1;i<=B;i++){ poly f;int len=1; for(int j=0;j<=m;j++){ f.push_back((a[j]>=i)); }while(len<=m*2) len<<=1; for(int j=m+1;j<len;j++) f.push_back(0); //for(auto ed:f) cout<<ed<<' ';cout<<endl; NTT(f,1); //NTT(f,-1); for(auto &ed:f) ed=1ll*ed*ed%mod; //for(auto ed:f) cout<<ed<<' ';cout<<endl; NTT(f,-1); for(int j=0;j<=m;j++){ v[j]+=f[j]/len;//cout<<f[j]<<' '; }//cout<<endl; } vector<pii> p; for(int i=1;i<=m;i++){ if(a[i]>B) p.push_back(mk(i,a[i])); } for(int i=0;i<p.size();i++){ for(int j=0;j<p.size();j++){ v[p[i].fi+p[j].fi]+=min(p[i].se,p[j].se)-B; } } for(int i=1;i<=m;i++){ cout<<v[i]/2<<' '; } return 0; }


测评信息: