【BZOJ3527】[Zjoi2014]力 FFT

【BZOJ3527】[Zjoi2014]力

Description

给出n个数qi,给出Fj的定义如下:
令Ei=Fi/qi,求Ei.

Input

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

Output

 n行,第i行输出Ei。与标准答案误差不超过1e-2即可。

Sample Input

5
4006373.885184
15375036.435759
1717456.469144
8514941.004912
1410681.345880

Sample Output

-16838672.693
3439.793
7509018.566
4595686.886
10903040.872

题解:对于上面的式子,我们将ij分开计算

【BZOJ3527】[Zjoi2014]力 FFT_第1张图片(感觉并没有推什么)

然后上面那个本身就是一个卷积,下面那个跟快速傅里叶之二一样,反转过来也是一个卷积,用FFT算出来后相减即可

#include 
#include 
#include 
#include 
#define pi acos(-1.0)
#define z z
using namespace std;
struct cp
{
	double x,y;
	cp (double a,double b){x=a,y=b;	}
	cp (){}
	cp operator + (cp a){return cp(x+a.x,y+a.y);}
	cp operator - (cp a){return cp(x-a.x,y-a.y);}
	cp operator * (cp a){return cp(x*a.x-y*a.y,x*a.y+y*a.x);}
}n1[1<<20],n2[1<<20];
double q[1<<20],a1[1<<20],a2[1<<20];
int n;
void init(cp *a,int len)
{
	int i,j,t=0;
	for(i=0;it)	swap(a[i],a[t]);
		for(j=(len>>1);(t^=j)>=1);
	}
}
void FFT(cp *a,int len,int f)
{
	init(a,len);
	int i,j,k,h;
	cp t;
	for(h=2;h<=len;h<<=1)
	{
		cp wn=cp(cos(f*2*pi/h),sin(f*2*pi/h));
		for(j=0;j

转载于:https://www.cnblogs.com/CQzhangyu/p/6878518.html

你可能感兴趣的:(【BZOJ3527】[Zjoi2014]力 FFT)