[ZJOI2014]力【FFT】

[ZJOI2014]力

已知\[E(j)=\sum_{i < j} \frac{q_i}{(i-j)^2}-\sum_{i > j} \frac{q_i}{(i-j)^2}\], 求\(E\)

令\(a(i)=q_i ,b(i)=i^{-2}\)

对于减号左边,\[L(j)=\sum_{i < j}a(i)b(j-i)\]

对于减号右边,\[R(j)=-\sum_{i > j}a(i)b(i-j)\]

令\[c(i)=b(i-n)=(i-n)^{-2}, i > n\], 则\[L(j)=\sum_{i < j}a(i)b(j-i+n-n)=\sum_{i < j} a(i)c(j-i+n)=(a*c)(n+j)\]

令\[c(i)=-b(n-i)=-(n-i)^{-2}, i < n\],即\[c(n-i)=-b(i)=-i^{-2}\],则\[R(j)=\sum_{i > j}a(i)b(i-j)=\sum_{i > j}a(i)c(n-i+j)=(a*c)(n+j)\]

特殊的,令\(c(n)=0\)

则\[E(j)=(a*c)(n+j)\]

求出\(a\)和\(c\)的卷积就好了

const double pi=acos(-1.0);
const int Maxn=2e6+10;
int n, l, r[Maxn], lim=1;

struct complex{double a, b; complex(double a=0, double b=0):a(a), b(b){}} f[Maxn], g[Maxn];
complex operator +(complex &A, complex &B){return complex(A.a+B.a, A.b+B.b);}
complex operator -(complex &A, complex &B){return complex(A.a-B.a, A.b-B.b);}
complex operator *(complex &A, complex &B){return complex(A.a*B.a-A.b*B.b, A.b*B.a+A.a*B.b);}

void FFT(complex *A, int tp){
    for(int i=0; i < lim; i++) if(i < r[i]) swap(A[i], A[r[i]]);
    complex wn, w, x, y;
    for(int mid=1; mid < lim; mid<<=1){ wn=complex(cos(pi/mid), tp*sin(pi/mid));
        for(int j=0, R=mid<<1; j < lim; j+=R){ w=complex(1, 0);
            for(int k=0; k < mid; k++, w=w*wn) x=A[j+k], y=w*A[j+k+mid], A[j+k]=x+y, A[j+k+mid]=x-y;
        }
    }
}
void solve(){
    n=read();
    for(int i=1; i <= n; i++) scanf("%lf", &f[i].a); g[n].a=0;
    for(int i=0; i < n; i++) g[i].a=-1.0/(n-i)/(n-i);
    for(int i=n+1; i <= n*2; i++) g[i].a=1.0/(i-n)/(i-n);
    while(lim <= n*3) lim <<= 1, l++;
    for(int i=0; i < lim; i++) r[i]=(r[i>>1]>>1)|((i&1)<<l-1);
    FFT(f, 1); FFT(g, 1); for(int i=0; i < lim; i++) f[i]=f[i]*g[i];
    FFT(f, -1); for(int i=n+1; i <= n+n; i++) printf("%lf\n", f[i].a/lim);
}

原文地址:https://www.cnblogs.com/zerolt/p/9297922.html

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

[ZJOI2014]力【FFT】的相关文章

[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

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 {

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

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

BZOJ 3527: [Zjoi2014]力 [快速傅里叶变换]

3527: [Zjoi2014]力 Time Limit: 30 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 1723  Solved: 1015[Submit][Status][Discuss] Description 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. Input 第一行一个整数n. 接下来n行每行输入一个数,第i行表示qi. n≤100000,0<qi<1000000000 Output n行,第i