母函数
没听过的可以去baidu
http://blog.miskcoo.com/2015/04/bzoj-3771
#include<cstdio>
#include<iostream>
#include<cstring>
#include<complex>
#include<cmath>
#include<cstdlib>
using namespace std;
const double pi=acos(-1);
char c;
inline void read(int &a){a=0;do c=getchar();while(c<'0'||c>'9');while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar();}
int len=262144;
#define com complex<double>
struct Complex_Line
{
com*D;
inline void Bg(){D=new com[len];}
inline com&operator [](int x){return D[x];}
};
int rev[300000];
void Rader()
{
int t=1;
while(len>(1<<t))t++;
for(int i=0;i<len;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(t-1));
}
Complex_Line Rev(Complex_Line a)
{
Complex_Line res;
res.Bg();
for(int i=0;i<len;i++)res[i]=a[rev[i]];
return res;
}
Complex_Line FFT(Complex_Line a,int flag)
{
Complex_Line res;
res=Rev(a);
for(int i=1;i<len;i<<=1)
{
com W(cos(pi/i),flag*sin(pi/i));
for(int j=0;j<len;j+=i<<1)
{
com W0(1,0);
for(int k=0;k<i;k++)
{
com x=res[j+k],y=W0*res[j+k+i];
res[j+k]=x+y;
res[j+k+i]=x-y;
W0*=W;
}
}
}
if(flag==-1)
for(int i=0;i<len;i++)res[i]/=len;
return res;
}
const
double eps=1e-5;
int main()
{
int n;
read(n);
Complex_Line A,B,C;
A.Bg(),B.Bg(),C.Bg();
for(int i=0;i<len;i++)
A[i]=B[i]=C[i]=0;
for(int i=1;i<=n;i++)
{
int j;read(j);A[j]+=1,B[j*2]+=1,C[j*3]+=1;
}
Rader();
Complex_Line D,E,F;
D=FFT(A,1),E=FFT(B,1),F=FFT(C,1);
Complex_Line G;
G.Bg();
for(int i=0;i<len;i++)
G[i]=D[i]+(D[i]*D[i]-E[i])/2.0+(D[i]*D[i]*D[i]-3.0*D[i]*E[i]+2.0*F[i])/6.0;
Complex_Line Ans;
Ans=FFT(G,-1);
double Q;
for(int i=0;i<len;i++)
if(abs(Q=Ans[i].real())+0.5>=1)
printf("%d %d\n",i,(int)(Q+0.5));
return 0;
}