P3338 [ZJOI2014]力 /// FFT 公式转化翻转

题目大意:

https://www.luogu.org/problemnew/show/P3338

题解

#include <bits/stdc++.h>
#define N 300005
#define PI acos(-1.0)
using namespace std;

struct cpx {
    double x,y;
    cpx (double a=0.0,double b=0.0) { x=a; y=b; }
    cpx operator - (const cpx &b)const { return cpx(x-b.x, y-b.y); }
    cpx operator + (const cpx &b)const { return cpx(x+b.x, y+b.y); }
    cpx operator * (const cpx &b)const { return cpx(x*b.x-y*b.y, x*b.y+y*b.x); }
}f1[N], f2[N], g[N];
int n, l, len, r[N];

void fft(cpx a[],double on)
{
    for(int i=0;i<len;i++)
        if(i<r[i]) swap(a[i],a[r[i]]);
    for(int i=1;i<len;i<<=1) {
        cpx wn(cos(PI/i),on*sin(PI/i));
        for(int j=0;j<len;j+=(i<<1)) {
            cpx w(1,0);
            for(int k=0;k<i;k++,w=w*wn) {
                cpx u=a[j+k], v=w*a[j+k+i];
                a[j+k]=u+v, a[j+k+i]=u-v;
            }
        }
    }
}

void solve()
{
    fft(f1,1); fft(f2,1); fft(g,1);
    for(int i=0;i<=len;i++)
        f1[i]=f1[i]*g[i], f2[i]=f2[i]*g[i];
    fft(f1,-1); fft(f2,-1);
    for(int i=0;i<=len;i++)
        f1[i].x=f1[i].x/len, f2[i].x=f2[i].x/len;
    for(int i=1;i<=n;i++)
        printf("%.3f\n",-f2[n+1-i].x+f1[i].x);
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) {
        scanf("%lf",&f1[i].x);
        f2[n+1-i].x=f1[i].x;
        g[i].x=(double)(1.0/i/i);
    }

    len=1; l=0;
    while(len<(n<<1)) len<<=1, l++;
    for(int i=0;i<=len;i++)
        r[i]=( r[i>>1]>>1 )|( (i&1)<<(l-1) );

    solve();

    return 0;
}

原文地址:https://www.cnblogs.com/zquzjx/p/9468337.html

时间: 2025-01-11 10:19:04

P3338 [ZJOI2014]力 /// FFT 公式转化翻转的相关文章

luogu P3338 [ZJOI2014]力 |FFT

我是机房最后一个学会fft的菜鸡.. 推柿子,套模板 找找bug,乱搞一下 #include<cmath> #include<cstdio> #include<complex> #include<iostream> #include<algorithm> using namespace std; #define ll long long const int N = 4e5+10; const double pi=acos(-1.0); typed

[Zjoi2014]力 FFT

#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> using namespace std; typedef double dd; const dd pi=acos(0.0)*2; #define N 400005 struct P{ dd x,y; P(dd A=0.0,dd B=0.0){ x=A; y=B; } P

[Zjoi2014]力(FFT/NTT)

[Zjoi2014]力(FFT,卷积) 题意:给定\(n\)个点电荷,排在单位数轴上,求每个点的场强 考虑每个\(i\)对于每个\(j\)的贡献,分析式子 \(E=\cfrac{q_i}{(j-i)^2}\) 令\(f(x)=\sum q_ix^i\) \(g(x)=\sum a_ix^i,a_i=i<0?-\frac{1}{i^2}:\frac{1}{i^2}\) \(g(x)\)每一项\(x\)的指数其实是\(j-i\)的值 求\(f(x)\cdot g(x)\)即可,注意负数系数的话偏移一

BZOJ 3527: [Zjoi2014]力 FFT

3527: [Zjoi2014]力 Description 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. Input 第一行一个整数n. 接下来n行每行输入一个数,第i行表示qi. n≤100000,0<qi<1000000000 Output n行,第i行输出Ei.与标准答案误差不超过1e-2即可. Sample Input 5 4006373.885184 15375036.435759 1717456.469144 8514941.004912 1410681.34

【BZOJ】3527: [Zjoi2014]力 FFT

[参考]「ZJOI2014」力 - FFT by menci [算法]FFT处理卷积 [题解]将式子代入后,化为Ej=Aj-Bj. Aj=Σqi*[1/(i-j)^2],i=1~j-1. 令f(i)=qi,g(i)=1/i^2,定义f(0)=g(0)=0(方便卷积). Aj=Σf(i)*g(j-i),i=0~j-1,标准的卷积形式. 而对于Bj,将g反转后就是和为i+n-1的标准卷积形式了. 第一次FFT后,记得对a数组后半部分清零后再进行第二次FFT. 复杂度O(n log n). #incl

【bzoj3527】[Zjoi2014]力 FFT

2016-06-01  21:36:44 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3527 我就是一个大傻叉 微笑脸 1 #include<bits/stdc++.h> 2 #define inf 1000000000 3 #define ll long long 4 #define N 500005 5 using namespace std; 6 int read(){ 7 int x=0,f=1;char ch=getchar

[bzoj3527] [洛谷P3338] [Zjoi2014]力

Description 给出n个数qi,给出Fj的定义如下: \[ F_j=\sum\limits_{i<j} \frac{q_iq_j}{(i-j)^2} - \sum\limits_{i>j} \frac{q_iq_j}{(i-1)^2} \] 令Ei=Fi/qi,求Ei. Input 第一行一个整数n. 接下来n行每行输入一个数,第i行表示qi. n≤100000,0<qi<1000000000 Output n行,第i行输出Ei.与标准答案误差不超过1e-2即可. Samp

P3338 [ZJOI2014]力

思路 颓柿子的题目 要求求这样的一个式子 \[ F_j=\sum_{i<j}\frac{q_iq_j}{(i-j)^2}-\sum_{i>j}\frac{q_iq_j}{(i-j)^2} \] 令\(E_i=\frac{F_i}{q_i}\),求所有的\(E_i\) 对于Ei,显然可以 \[ E_i=\sum_{j=0}^{i-1}\frac{q_j}{(i-j)^2}-\sum_{j=i+1}^n\frac{q_j}{(i-j)^2} \] 前后没什么关联,可以分开考虑,首先考虑前面部分 \

BZOJ[3527],[ZJOI2014]力(FFT)

BZOJ[3527],[ZJOI2014]力(FFT) 题意: 给出\(n\)个数\(q_i\),给出\(Fj\)的定义如下: \(F_j=\sum \limits _ {i < j} \frac{q_iq_j}{(i-j)^2}-\sum \limits _{i >j} \frac{q_iq_j}{(i-j)^2}.\) 令\(E_i=F_i/q_i\),求\(E_i\). 题解: 一开始没发现求\(E_i\)... 其实题目还更容易想了... \(E_i=\sum\limits _{j&l