zoukankan      html  css  js  c++  java
  • 【bzoj3527】[Zjoi2014]力 FFT

    题目描述

    给出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
    " , -c[n].x);
    	for(i = 1 ; i < n - 1 ; i ++ ) printf("%lf
    " , a[i - 1].x - c[n + i].x);
    	printf("%lf
    " , a[n - 2].x);
    	return 0;
    }
    

     

  • 相关阅读:
    异常详细信息: System.Data.SqlClient.SqlException:过程或函数 需要参数 但未提供该参数。
    silverlight error message,ErrorCode:2254 ErrorCode: 1001
    每日英语 词汇
    每日词汇
    电子商务网站用户体验根据用户的习惯进行推荐
    刚做项目的时候
    silverlight 不可
    在Centos6上安装RabbitMQ的过程(有点坑)
    SpringBoot整合Redis
    在IDEA中创建工程并将工程添加至Git
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/6878856.html
Copyright © 2011-2022 走看看