额我不是来发题解的,只是非常郁闷= =,这题的答案最大是1.2e9/6左右,所以用ntt的话要在模意义下除以6,不能最后除,否则刚好爆掉= =
#include<bits/stdc++.h> #define N 131072 using namespace std; const int p=998244353; int up(int s,int t){ return 1ll*s*t%p; } int wop(int u,int k){ for(int s=1;;u=up(u,u)){ if(k%2)s=up(s,u); if(!(k/=2))return s; } } void fft(int* q,int n,int m){ int i,j,k; for(i=j=0;i!=n;++i){ if(i<j) swap(q[i],q[j]); for(k=n>>1; (j^=k)<k;k>>=1); } for(i=1;i!=n;i*=2){ int s=wop(3,p-1 +(p-1)*m/i/2); for(j=0;j!=n;j+=i*2){ int t=1; for(k=j;k!=j+i;t=up(t,s)){ int l=up(t,q[k+i]); q[k+i]=(q[k]-l+p)%p; q[k]=(q[k]+l)%p,++k; } } } if(!~m){ int s=wop(n,p-2); for(i=0;i!=n;++i) q[i]=up(q[i],s); } } int t[N],s[N],x,y,u[N]; int main(){ scanf("%d",&y); while(y--){ scanf("%d",&x); ++t[x*2]; ++s[x],u[x]+=6; u[x*2]-=3; u[x*3]+=2; } y=wop(6,p-2); fft(s,N,1); fft(t,N,1); for(int i=0;i!=N;++i) s[i]=up(s[i], up(s[i],s[i]) +up(s[i]-t[i]+p,3)); fft(s,N,-1); for(int i=0;i!=N;++i) if(x=up(s[i]+u[i],y)) printf("%d %d\n",i,x); }