给出n个数qi,给出Fj的定义如下:
令Ei=Fi/qi,求Ei.
标签:技术分享 upload pac div clu oid har namespace sed
n行,第i行输出Ei。与标准答案误差不超过1e-2即可。
仔细观察这个式子 前半部分的Ei很符合卷积的性质,但是后半部分看的十分不友善
我们用f1[i]表示q[i],f2[i]表示q[n-i-1],a[i]表示(1.0/i/i);
那么E[i]前半部分=sigma qj/(j-i)^2可以看做f1[i]*a[j-i],一个赤裸裸的卷积
后半部分可以表示为f2[n-i-1]*a[j-i],只好像不像卷积啊,我们把f2[i]数组给反过来,这样和不就是一个定值了么
1 #include <bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 const double pi=acos(-1); 5 inline int read(){ 6 int x=0;int f=1;char ch=getchar(); 7 while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();} 8 while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();} 9 return x*f; 10 } 11 const int MAXN=1e6+10; 12 typedef complex <double> E; 13 E a[MAXN],f1[MAXN],f2[MAXN],w[MAXN]; 14 int L,H,R[MAXN]; 15 inline void FFT(E *a,int f){ 16 for(int i=0;i<L;i++){ 17 if(i<R[i]) swap(a[i],a[R[i]]); 18 } 19 for(int len=2;len<=L;len<<=1){ 20 int l=len>>1; 21 E wn(cos(pi/l),f*sin(pi/l)); 22 for(int i=1;i<l;i++) w[i]=w[i-1]*wn; 23 for(int st=0;st<L;st+=len){ 24 for(int k=0;k<l;k++){ 25 E x=a[st+k];E y=w[k]*a[st+l+k]; 26 a[st+k]=x+y;a[st+k+l]=x-y; 27 } 28 } 29 } 30 if(f==-1){ 31 for(int i=0;i<L;i++){ 32 a[i]/=L; 33 } 34 } 35 } 36 int main(){ 37 int n=read();w[0].real()=1; 38 for(int i=0;i<n;i++){ 39 scanf("%lf",&f1[i].real()); 40 f2[n-i-1]=f1[i]; 41 } 42 for(int i=1;i<=n;i++){ 43 a[i]=(1.0/i/i); 44 } 45 L=1; 46 while(L<=n+n) L<<=1,H++; 47 for(int i=0;i<L;i++){ 48 R[i]=(R[i>>1]>>1)|((i&1)<<(H-1)); 49 } 50 FFT(f1,1);FFT(a,1);FFT(f2,1); 51 for(int i=0;i<L;i++){ 52 f1[i]=f1[i]*a[i]; 53 f2[i]=f2[i]*a[i]; 54 } 55 FFT(f1,-1);FFT(f2,-1); 56 for(int i=0;i<n;i++){ 57 printf("%.3lf\n",f1[i].real()-f2[n-i-1].real()); 58 } 59 return 0; 60 }
标签:技术分享 upload pac div clu oid har namespace sed
原文地址:http://www.cnblogs.com/something-for-nothing/p/7898684.html