[ZJOI2014]力

题目描述

输入输出格式

输入格式:

第一行一个整数n。

接下来n行每行输入一个数,第i行表示qi。

输出格式:

n行,第i行输出Ei。

与标准答案误差不超过1e-2即可。

输入输出样例

输入样例#1:

5
4006373.885184
15375036.435759
1717456.469144
8514941.004912
1410681.345880

输出样例#1:

-16838672.693
3439.793
7509018.566
4595686.886
10903040.872

说明

对于30%的数据,n≤1000。

对于50%的数据,n≤60000。

对于100%的数据,n≤100000,0<qi<1000000000。

题解:

E[i]=∑q[j]/(i-j)^2-∑q[j]/(j-i)^2

令g[i]=1/(i^2) 

E[i]=∑q[j]*g[i-j]-∑q[j]*g[j-i]

 ∑q[j]*g[i-j]是卷积形式,求出x^i的系数就行

∑q[j]*g[j-i]        (i<j<=n)

=∑q[j+i]*g[j]        (i<j+i<=n)=>(0<j<=n-i)

翻转q得到p[n-i]=q[i],t=n-i

=∑q[j+i]*g[j]=∑p[n-i-j]*g[j]=∑q[t-j]*g[j]         (0<j<=t)

∑q[t-j]*g[j]      (0<j<=t)是卷积形式,求出x^(n-i)的系数就行

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<cmath>
  6 using namespace std;
  7 double pi=acos(-1.0);
  8 const int N=400001;
  9 struct Complex
 10 {
 11     double r,i;
 12     Complex (double r=0,double i=0):r(r),i(i){};
 13     Complex operator+(const Complex &x)
 14     {
 15         return Complex(r+x.r,i+x.i);
 16     }
 17     Complex operator-(const Complex &x)
 18     {
 19         return Complex(r-x.r,i-x.i);
 20     }
 21     Complex operator*(const Complex &x)
 22     {
 23         return Complex(r*x.r-i*x.i,i*x.r+x.i*r);
 24     }
 25 }A[N],B[N],C[N];
 26 int n,len;
 27 double p[N],q[N],g[N],ans[N];
 28 void rader(Complex F[],int len)
 29 {int i;
 30     int j=len/2;
 31     for (i=1;i<len-1;i++)
 32     {
 33         if (i<j)swap(F[i],F[j]);
 34          int k=len/2;
 35          while (j>=k)
 36          {
 37             j-=k;
 38             k/=2;
 39          }
 40          if (j<k) j+=k;
 41     }
 42 }
 43 void FFT(Complex F[],int len,int t)
 44 {int i,j,k;
 45     rader(F,len);
 46     for (i=2;i<=len;i=i*2)
 47     {
 48         Complex wn;
 49         wn.r=cos(t*2*pi/i);wn.i=sin(t*2*pi/i);
 50         for (j=0;j<len;j+=i)
 51         {
 52             Complex E;
 53             E.r=1;E.i=0;
 54              for (k=j;k<j+i/2;k++)
 55               {
 56                     Complex u=F[k];
 57                     Complex v=E*F[k+i/2];
 58                 F[k]=u+v;
 59                 F[k+i/2]=u-v;
 60                 E=E*wn;
 61               }
 62         }
 63     }
 64     if (t==-1)
 65      for (i=0;i<len;i++)
 66       F[i].r/=len;
 67 }
 68 int main()
 69 {int i,j;
 70     cin>>n;
 71      for (i=1;i<=n;i++)
 72      {
 73         scanf("%lf",&q[i]);
 74      }
 75      for (i=1;i<=n;i++)
 76      p[i]=q[n-i];
 77      p[0]=q[n];
 78      for (i=1;i<=n;i++)
 79      g[i]=1.0/((double)i*i);
 80
 81      len=1;
 82      while (len<2*n) len*=2;
 83      for (i=0;i<len;i++)
 84      A[i].r=q[i],B[i].r=g[i];
 85      FFT(A,len,1);FFT(B,len,1);
 86      for (i=0;i<len;i++)
 87      C[i]=A[i]*B[i];
 88      FFT(C,len,-1);
 89      for (i=0;i<=n;i++)
 90       ans[i]=C[i].r;
 91     memset(A,0,sizeof(A));
 92     memset(B,0,sizeof(B));
 93     memset(C,0,sizeof(C));
 94
 95       for (i=0;i<len;i++)
 96       A[i].r=p[i],B[i].r=g[i];
 97     FFT(A,len,1);FFT(B,len,1);
 98      for (i=0;i<len;i++)
 99      C[i]=A[i]*B[i];
100      FFT(C,len,-1);
101      for (i=0;i<=n;i++)
102      ans[i]-=C[n-i].r;
103     for (i=1;i<=n;i++)
104      printf("%.3lf\n",ans[i]);
105 }
时间: 2024-10-05 17:33:10

[ZJOI2014]力的相关文章

BZOJ 3527: [Zjoi2014]力 [快速傅里叶变换]

3527: [Zjoi2014]力 Time Limit: 30 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 1723  Solved: 1015[Submit][Status][Discuss] Description 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. Input 第一行一个整数n. 接下来n行每行输入一个数,第i行表示qi. n≤100000,0<qi<1000000000 Output n行,第i

[Zjoi2014]力 FFT

#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> using namespace std; typedef double dd; const dd pi=acos(0.0)*2; #define N 400005 struct P{ dd x,y; P(dd A=0.0,dd B=0.0){ x=A; y=B; } P

【BZOJ 3527】 [Zjoi2014]力

3527: [Zjoi2014]力 Description 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. Input 第一行一个整数n. 接下来n行每行输入一个数,第i行表示qi. Output n行,第i行输出Ei. 与标准答案误差不超过1e-2即可. Sample Input 5 4006373.885184 15375036.435759 1717456.469144 8514941.004912 1410681.345880 Sample Output -16838

BZOJ 3527: [Zjoi2014]力 FFT

3527: [Zjoi2014]力 Description 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. Input 第一行一个整数n. 接下来n行每行输入一个数,第i行表示qi. n≤100000,0<qi<1000000000 Output n行,第i行输出Ei.与标准答案误差不超过1e-2即可. Sample Input 5 4006373.885184 15375036.435759 1717456.469144 8514941.004912 1410681.34

3527: [Zjoi2014]力 - BZOJ

题目大意:给出n个数qi,定义 Fj为 令 Ei=Fi/qi,求Ei. 看了很久题解,终于有些眉目,因为知道要用FFT,所以思路就很直了 其实我们就是要±1/(j-i)^2 ( i-j大于0时为正,小于0时为负 ) 和 qi 的乘积要算到j这个位置上,这个满足卷积,所以用FFT优化,但是j-i有负数,所以我们就加上一个n 于是设pi={ i>n,1/(i-n)^2 i<n,-1/(n-i)^2 其他,0 } 然后就套FFT模板就行了 1 const 2 maxn=800100; 3 type

BZOJ[3527],[ZJOI2014]力(FFT)

BZOJ[3527],[ZJOI2014]力(FFT) 题意: 给出\(n\)个数\(q_i\),给出\(Fj\)的定义如下: \(F_j=\sum \limits _ {i < j} \frac{q_iq_j}{(i-j)^2}-\sum \limits _{i >j} \frac{q_iq_j}{(i-j)^2}.\) 令\(E_i=F_i/q_i\),求\(E_i\). 题解: 一开始没发现求\(E_i\)... 其实题目还更容易想了... \(E_i=\sum\limits _{j&l

[ZJOI2014]力【FFT】

[ZJOI2014]力 已知\[E(j)=\sum_{i < j} \frac{q_i}{(i-j)^2}-\sum_{i > j} \frac{q_i}{(i-j)^2}\], 求\(E\) 令\(a(i)=q_i ,b(i)=i^{-2}\) 对于减号左边,\[L(j)=\sum_{i < j}a(i)b(j-i)\] 对于减号右边,\[R(j)=-\sum_{i > j}a(i)b(i-j)\] 令\[c(i)=b(i-n)=(i-n)^{-2}, i > n\], 则

[Zjoi2014]力(FFT/NTT)

[Zjoi2014]力(FFT,卷积) 题意:给定\(n\)个点电荷,排在单位数轴上,求每个点的场强 考虑每个\(i\)对于每个\(j\)的贡献,分析式子 \(E=\cfrac{q_i}{(j-i)^2}\) 令\(f(x)=\sum q_ix^i\) \(g(x)=\sum a_ix^i,a_i=i<0?-\frac{1}{i^2}:\frac{1}{i^2}\) \(g(x)\)每一项\(x\)的指数其实是\(j-i\)的值 求\(f(x)\cdot g(x)\)即可,注意负数系数的话偏移一

【BZOJ】3527: [Zjoi2014]力 FFT

[参考]「ZJOI2014」力 - FFT by menci [算法]FFT处理卷积 [题解]将式子代入后,化为Ej=Aj-Bj. Aj=Σqi*[1/(i-j)^2],i=1~j-1. 令f(i)=qi,g(i)=1/i^2,定义f(0)=g(0)=0(方便卷积). Aj=Σf(i)*g(j-i),i=0~j-1,标准的卷积形式. 而对于Bj,将g反转后就是和为i+n-1的标准卷积形式了. 第一次FFT后,记得对a数组后半部分清零后再进行第二次FFT. 复杂度O(n log n). #incl

bzoj 3527: [Zjoi2014]力

都说这是个FFT模板题 可我这种蒟蒻还是看了大半天... 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<queue> 7 #include<algorithm> 8 #include<vector> 9 #include<complex