【BZOJ 3527】 3527: [Zjoi2014]力 (FFT)
3527: [Zjoi2014]力
Time Limit: 30 Sec Memory Limit: 256 MBSec Special Judge
Submit: 2003 Solved: 1196Description
给出n个数qi,给出Fj的定义如下:令Ei=Fi/qi,求Ei.Input
第一行一个整数n。接下来n行每行输入一个数,第i行表示qi。n≤100000,0<qi<1000000000Output
n行,第i行输出Ei。与标准答案误差不超过1e-2即可。
Sample Input
5
4006373.885184
15375036.435759
1717456.469144
8514941.004912
1410681.345880Sample Output
-16838672.693
3439.793
7509018.566
4595686.886
10903040.872HINT
Source
【分析】
这题的卷积没那么好看出来吧?
Ei=Fi/qi
所以$Ej=\sum_{i<j} \dfrac{qi}{(j-i)^2}-\sum_{i>j} \dfrac{qi}{(j-i)^2}+0(i=j)$
容易看出,分子和分母的和是一样的(卷积)
但是当i>j时系数是减,且这个下标是负号,怎么办呢?
弄一个具体例子容易看出来:
说明是负数的时候$F[i]=-\dfrac{1}{i^2}$ 正数的时候$F[i]=\dfrac{1}{i^2}$$F[0]=0$
即$E[n]=\sum A[i]*F[n-i]$,但这里的n-i可以为负,i从1到max,而不是1到n。
所以把下标全部右移n位即可。
即
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 #include<cmath> 7 using namespace std; 8 #define Maxn 100000*8 9 const double pi=acos(-1); 10 11 struct P 12 { 13 double x,y; 14 P() {x=y=0;} 15 P(double x,double y):x(x),y(y){} 16 friend P operator + (P x,P y) {return P(x.x+y.x,x.y+y.y);} 17 friend P operator - (P x,P y) {return P(x.x-y.x,x.y-y.y);} 18 friend P operator * (P x,P y) {return P(x.x*y.x-x.y*y.y,x.x*y.y+x.y*y.x);} 19 }a[Maxn],b[Maxn]; 20 21 void fft(P *s,int n,int t) 22 { 23 if(n==1) return; 24 P a0[n>>1],a1[n>>1]; 25 for(int i=0;i<=n;i+=2) a0[i>>1]=s[i],a1[i>>1]=s[i+1]; 26 fft(a0,n>>1,t);fft(a1,n>>1,t); 27 P wn(cos(2*pi/n),t*sin(2*pi/n)),w(1,0); 28 for(int i=0;i<(n>>1);i++,w=w*wn) s[i]=a0[i]+w*a1[i],s[i+(n>>1)]=a0[i]-w*a1[i]; 29 } 30 31 int main() 32 { 33 int n,m; 34 scanf("%d",&n);n--; 35 m=2*n; 36 for(int i=0;i<=n;i++) scanf("%lf",&a[i].x); 37 for(int j=n;j>=1;j--) b[n-j].x=-1.0/j/j; 38 b[n].x=0; 39 for(int j=1;j<=n;j++) b[n+j].x=1.0/j/j; 40 int nn=1; 41 while(nn<n+m) nn<<=1; 42 fft(a,nn,1);fft(b,nn,1); 43 for(int i=0;i<=nn;i++) a[i]=a[i]*b[i]; 44 fft(a,nn,-1); 45 for(int i=n;i<=n+n;i++) printf("%.3lf\n",a[i].x/nn); 46 return 0; 47 }
2017-04-13 14:26:20