首页 > 代码库 > 【bzoj3527】[Zjoi2014]力 FFT
【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\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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。