https://cn.vjudge.net/problem/SPOJ-TSUM
跟焦作选拔的时候那个题目的思路完全一样,用母函数可以考虑到所有的情况,然后去掉三个重复的和两个重复的再除以6就得到了去重后的结果。
收获主要是发现了FFT那个乘法的操作可以全部在一次循环里完成。。。神奇。。还有就是移位操作可以避免复数,而输出的时候记着要移回去原位。
#includeusing namespace std; typedef long long LL; const int maxn=(1<<17); const int mod=998244353; const int INF=0x3f3f3f3f; const double PI=acos(-1.0); struct Complex { double x,y; Complex(double _x=0.0,double _y=0.0) { x=_x,y=_y; } Complex operator-(const Complex &b)const { return Complex(x-b.x,y-b.y); } Complex operator +(const Complex &b)const { return Complex(x+b.x,y+b.y); } Complex operator *(const Complex &b)const { return Complex(x*b.x-y*b.y,x*b.y+y*b.x); } }; void change(Complex y[],int len) { int i,j,k; for(i=1,j=(len>>1);i >1); while(j>=k) { j-=k; k>>=1; } if(j >1);k++) { u=y[k]; t=w*y[k+(h>>1)]; y[k]=u+t; y[k+(h>>1)]=u-t; w=w*wn; } } } if(on==-1) { for(int i=0;i 0) { printf("%d : %lld\n",i-60000,ans); } } return 0; }