码迷,mamicode.com
首页 > 其他好文 > 详细

【bzoj3527】[Zjoi2014]力 FFT

时间:2017-05-19 16:05:28      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:algorithm   答案   efi   lin   技术分享   define   wap   print   题目   

题目描述

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

输入

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

输出

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

样例输入

5
4006373.885184
15375036.435759
1717456.469144
8514941.004912
1410681.345880

样例输出

-16838672.693
3439.793
7509018.566
4595686.886
10903040.872


题解

FFT

把qi除掉,两部分分开看,把分子和分母分开,发现下标的和或差是定值。

然后转化为卷积来求即可。

前后两端需要特判。

#include <cstdio>
#include <cmath>
#include <algorithm>
#define N 1 << 20
#define pi acos(-1)
using namespace std;
struct data
{
	double x , y;
	data() {x = y = 0;}
	data(double x0 , double y0) {x = x0 , y = y0;}
	data operator+(const data a)const {return data(x + a.x , y + a.y);}
	data operator-(const data a)const {return data(x - a.x , y - a.y);}
	data operator*(const data a)const {return data(x * a.x - y * a.y , x * a.y + y * a.x);};
}a[N] , b[N] , c[N] , d[N];
double q[N];
void fft(data *a , int n , int flag)
{
	int i , j , k;
	for(i = k = 0 ; i < n ; i ++ )
	{
		if(i > k) swap(a[i] , a[k]);
		for(j = (n >> 1) ; (k ^= j) < j ; j >>= 1);
	}
	for(k = 2 ; k <= n ; k <<= 1)
	{
		data wn(cos(2 * pi * flag / k) , sin(2 * pi * flag / k));
		for(i = 0 ; i < n ; i += k)
		{
			data t , w(1 , 0);
			for(j = i ; j < i + (k >> 1) ; j ++ , w = w * wn)
				t = w * a[j + (k >> 1)] , a[j + (k >> 1)] = a[j] - t , a[j] = a[j] + t;
		}
	}
}
void work(data *a , data *b , int len)
{
	int i;
	fft(a , len , 1) , fft(b , len , 1);
	for(i = 0 ; i < len ; i ++ ) a[i] = a[i] * b[i];
	fft(a , len , -1);
	for(i = 0 ; i < len ; i ++ ) a[i].x /= len;
}
int main()
{
	int n , i , len;
	scanf("%d" , &n);
	for(i = 0 ; i < n ; i ++ )
		scanf("%lf" , &q[i]) , a[i].x = c[i].x = q[i] , b[i].x = d[n - i - 1].x = 1.0 / (i + 1) / (i + 1);
	for(len = 1 ; len < 2 * n ; len <<= 1);
	work(a , b , len) , work(c , d , len);
	printf("%lf\n" , -c[n].x);
	for(i = 1 ; i < n - 1 ; i ++ ) printf("%lf\n" , a[i - 1].x - c[n + i].x);
	printf("%lf\n" , a[n - 2].x);
	return 0;
}

 

 

【bzoj3527】[Zjoi2014]力 FFT

标签:algorithm   答案   efi   lin   技术分享   define   wap   print   题目   

原文地址:http://www.cnblogs.com/GXZlegend/p/6878856.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!