题意:给出 n n n个数 q i q_i qi,定义 F j = ∑ i < j q i q j ( i − j ) 2 − ∑ i > j q i q j ( i − j ) 2 F_j=\sum\limits_{i<j}\frac{q_iq_j}{(i-j)^2}-\sum\limits_{i>j}\frac{q_iq_j}{(i-j)^2} Fj=i<j∑(i−j)2qiqj−i>j∑(i−j)2qiqj,令 E i = F i q i E_i=\frac{F_i}{q_i} Ei=qiFi,求 E i E_i Ei
E
i
=
∑
j
=
1
i
−
1
q
j
(
i
−
j
)
2
−
∑
j
=
i
+
1
n
q
j
(
i
−
j
)
2
E_i=\sum\limits_{j=1}^{i-1}\frac{q_j}{(i-j)^2}-\sum\limits_{j=i+1}^n\frac{q_j}{(i-j)^2}
Ei=j=1∑i−1(i−j)2qj−j=i+1∑n(i−j)2qj
设
A
i
=
∑
j
=
1
i
−
1
q
j
(
i
−
j
)
2
,
B
i
=
∑
j
=
i
+
1
n
q
j
(
i
−
j
)
2
A_i=\sum\limits_{j=1}^{i-1}\frac{q_j}{(i-j)^2},B_i=\sum\limits_{j=i+1}^n\frac{q_j}{(i-j)^2}
Ai=j=1∑i−1(i−j)2qj,Bi=j=i+1∑n(i−j)2qj,分开求
设
f
i
=
1
i
2
f_i=\frac{1}{i^2}
fi=i21,并规定
f
0
=
0
f_0=0
f0=0,那么
A
i
=
∑
j
+
k
=
i
q
j
f
k
A_i=\sum\limits_{j+k=i}q_jf_k
Ai=j+k=i∑qjfk,FFT求卷积即可
如果设
p
i
=
q
n
−
i
p_i=q_{n-i}
pi=qn−i即把
q
q
q翻转,那么
B
i
=
∑
j
=
1
n
−
i
q
j
+
i
j
2
=
∑
j
=
1
n
−
i
p
n
−
i
−
j
j
2
=
∑
j
+
k
=
n
−
i
p
j
f
k
B_i=\sum\limits_{j=1}^{n-i}\frac{q_{j+i}}{j^2}=\sum\limits_{j=1}^{n-i}\frac{p_{n-i-j}}{j^2}=\sum\limits_{j+k=n-i}p_jf_k
Bi=j=1∑n−ij2qj+i=j=1∑n−ij2pn−i−j=j+k=n−i∑pjfk,FFT求卷积即可
#include <cstdio>
#include <cmath>
#include <algorithm>
const int maxn = 1e5 + 207;
const double pi = acos(-1.0);
struct Complex {
double a, b;
Complex(double x, double y) : a(x), b(y) {}
Complex() : Complex(0.0, 0.0) {}
};
inline Complex operator+(const Complex &lhs, const Complex &rhs) {
return Complex(lhs.a + rhs.a, lhs.b + rhs.b);
}
inline Complex operator-(const Complex &lhs, const Complex &rhs) {
return Complex(lhs.a - rhs.a, lhs.b - rhs.b);
}
inline Complex operator*(const Complex &lhs, const Complex &rhs) {
return Complex(lhs.a * rhs.a - lhs.b * rhs.b, lhs.a * rhs.b + lhs.b * rhs.a);
}
int r[maxn << 2], lim, l, n;
Complex a[maxn << 2], b[maxn << 2], c[maxn << 2];
inline void fft(Complex *A, int tp) {
for (int i = 0; i < lim; ++i)
if (i < r[i]) std::swap(A[i], A[r[i]]);
for (int mid = 1; mid < lim; mid <<= 1) {
Complex wn = Complex(cos(pi / mid), tp * sin(pi / mid));
for (int j = 0; j < lim; j += mid << 1) {
Complex w = Complex(1, 0);
for (int k = 0; k < mid; ++k, w = w * wn) {
Complex x = A[j + k], y = w * A[j + k + mid];
A[j + k] = x + y;
A[j + k + mid] = x - y;
}
}
}
if (tp == -1) {
for (int i = 0; i < lim; ++i)
A[i] = Complex(A[i].a / lim, 0);
}
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%lf", &a[i].a);
b[n - i].a = a[i].a;
}
for (int i = 1; i <= n; ++i)
c[i].a = 1.0 / i / i;
for (lim = 1; lim <= n << 1; lim <<= 1, ++l);
for (int i = 0; i < lim; ++i)
r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1));
fft(a, 1); fft(b, 1); fft(c, 1);
for (int i = 0; i <= lim; ++i)
a[i] = a[i] * c[i], b[i] = b[i] * c[i];
fft(a, -1); fft(b, -1);
for (int i = 1; i <= n; ++i)
printf("%.5lf\n", a[i].a - b[n - i].a);
return 0;
}