洛谷 P3338 [ZJOI2014]力 解题报告

P3338 [ZJOI2014]力

题目描述

给出n个数qi,给出Fj的定义如下:

\(F_j = \sum_{ij}\frac{q_i q_j}{(i-j)^2 }\)

\(E_i=\frac{F_i}{q_i}\),求\(E_i\).

输入输出格式

输入格式:

第一行一个整数\(n\)

接下来\(n\)行每行输入一个数,第\(i\)行表示\(q_i\)

输出格式:

\(n\)行,第\(i\)行输出\(E_i\)

与标准答案误差不超过\(10^{-2}\)即可。

说明

对于\(30\%\)的数据,\(n\le1000\)

对于\(50\%\)的数据,\(n\le60000\)

对于\(100\%\)的数据,\(n\le100000\)\(0

[spj 0.01]


鉴于本傻子一开始啥也看不出来还是写一写好了。

把两边分开考虑。令\(f(x)=\frac{1}{x^2},g(x)=q_x\),然后发现就是\(FFT\)的形式,看成系数做就可以了。

右边转过来以后同理。

有一些细节比如

  • 1/(i*i)会被卡精度,要写1/i/i
  • \(f(0)=g(0)=0\)

Code:

#include 
#include 
#include 
const int N=(1<<18)+10;
struct complex
{
    double x,y;
    complex(){}
    complex(double x,double y){this->x=x,this->y=y;}
    complex friend operator +(complex n1,complex n2){return complex(n1.x+n2.x,n1.y+n2.y);}
    complex friend operator -(complex n1,complex n2){return complex(n1.x-n2.x,n1.y-n2.y);}
    complex friend operator *(complex n1,complex n2){return complex(n1.x*n2.x-n1.y*n2.y,n1.x*n2.y+n1.y*n2.x);}
}a[N],b[N],tmpx,tmpy,wn,w;
const double pi=3.1415926535897632;
int n,turn[N],len=1,L=-1;
double out[N],q[N];
void FFT(complex *a,int typ)
{
    for(int i=0;i>1]>>1|(i&1)<

2018.12.3

转载于:https://www.cnblogs.com/butterflydew/p/10059350.html

你可能感兴趣的:(洛谷 P3338 [ZJOI2014]力 解题报告)