题面

题解

恩, 我们首先有这两个关系

\[\displaystyle\begin{aligned} F_j &= \sum_{i < j}\frac{q_iq_j}{(i - j)^2} - \sum_{i > j}\frac{q_iq_j}{(i - j)^2}\\ &= q_j\cdot(\sum_{i < j}\frac{q_i}{(i - j)^2}-\sum_{i>j}\frac{q_i}{(i - j)^2})\end{aligned}
\]

然后由

\[\displaystyle E_i = \frac{F_i}{q_i}
\]

我们可以推出这样的式子

\[\displaystyle\begin{aligned}
E_i&=\frac{F_i}{q_i}\\&=\sum_{j<i}\frac{q_j}{(i - j)^2}-\sum_{j>i}\frac{q_j}{(j - i)^2}\\
\end{aligned}
\]

我们来看一下 n = 3 的情况

我们将红色的线的两端乘起来, 再把三条红线的和相加就得到了\(E_0\), 同理我们通过蓝线, 绿线可以得到\(E_1\), \(E_2\)

我们定义\(a_i = p_i\), \(b_i = \frac{1}{i ^ 2}\), 特别的, 我们定义\(b_{-i} = -\frac{1}{i ^ 2}\), 先别管为什么下标为负

\[\displaystyle\begin{aligned}
E_0&=a_0b_0+a_1b_{-1}+a_2b_{-2}\\
E_1&=a_0b_1+a_1b_0+a_2b_{-1}\\
E_2&=a_0b_2+a_1b_1+a_2b_0
\end{aligned}
\]

恩, 我们来讨论数组下标小于零的问题, 整体平移就行了嘛, 注意到\(b\)最小的下标为\((-3 + 1)\), 所以我们平移\((3 - 1)\)位就可以了, 所以有:

\[\begin{aligned}
E_0&=a_0b_2+a_1b_1+a_2b_0\Leftrightarrow E_0 = \sum_{i+j=2}a_ib_j\\
E_1&=a_0b_3+a_1b_2+a_2b_1\Leftrightarrow E_1 = \sum_{i+j=3}a_ib_j\\
E_2&=a_0b_4+a_1b_3+a_2b_2\Leftrightarrow E_2 = \sum_{i+j=4}a_ib_j
\end{aligned}
\]

恩, 我们来看一下卷积的形式

\[c_k = \sum_{i + j = k}a_ib_j
\]

我们会发现这里的\(E\)数组的下标离可以卷积差了一个\((3 - 1)\), 用\(E_2\)代替\(E_0\)就可以用\(a\)与\(b\)的卷积来算了

我们将特殊情况扩展到一般情况, 设\(E\)共有\(n\)项, 自己瞎猜一下可以发现\(b\)数组下标平移了\(n - 1\)位, \(E\)数组的下标平移了\(n - 1\)位, 所以, 最后我们输出\(E\)的第\([n - 1, (n - 1) + n - 1]\)项即可

这篇题解就是写给我们这种蒟蒻看的, 至于卷积, 我猜各位是为了练习FFT才来做这道题的吧

Code

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#define itn int
#define reaD read
#define N 1000005
const double pi = acos(-1);
using namespace std; int n, m, cnt, rev[N];
struct complex
{
double x, y;
complex(double xx = 0, double yy = 0) { x = xx; y = yy; }
complex operator + (complex p) { return complex(x + p.x, y + p.y); }
complex operator - (complex p) { return complex(x - p.x, y - p.y); }
complex operator * (complex p) { return complex(x * p.x - y * p.y, x * p.y + y * p.x); }
} a[N], b[N]; inline int read()
{
int x = 0, w = 1; char c = getchar();
while(c < '0' || c > '9') { if (c == '-') w = -1; c = getchar(); }
while(c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
return x * w;
} void FFT(complex* p, int opt)
{
for(int i = 0; i < m; i++) if(i < rev[i]) swap(p[i], p[rev[i]]);
for(int i = 1; i < m; i <<= 1)
{
complex cur = complex(cos(pi / i), opt * sin(pi / i));
for(int j = 0; j < m; j += (i << 1))
{
complex w = complex(1, 0);
for(int k = 0; k < i; k++, w = w * cur)
{
complex l = p[j + k], r = w * p[i + j + k];
p[j + k] = l + r; p[i + j + k] = l - r;
}
}
}
} int main()
{
n = read();
for(int i = 0; i < n; i++) scanf("%lf", &a[i].x);
for(int i = 1; i < n; i++)
{
b[i + n - 1].x = 1 / (1.0 * (double) i * i);
b[n - 1 - i].x = -b[i + n - 1].x;
}
for(m = 1; m <= 3 * n - 2; m <<= 1, cnt++);
for(int i = 0; i < m; i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (cnt - 1));
FFT(a, 1); FFT(b, 1);
for(int i = 0; i <= m; i++) a[i] = a[i] * b[i];
FFT(a, -1);
for(int i = n - 1; i <= 2 * n - 2; i++) printf("%.3lf\n", a[i].x / m);
return 0;
}

这可能是我写得最认真的一篇题解吧, 希望看这篇题解的泥萌可以康懂

[题解] [ZJOI2014] 力的更多相关文章

  1. [ZJOI3527][Zjoi2014]力

    [ZJOI3527][Zjoi2014]力 试题描述 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi.试求Ei. 输入 包含一个整数n,接下来n行每行输入一个数,第i行表示qi. 输出 有n ...

  2. [洛谷P3338] [ZJOI2014]力

    洛谷题目链接:P3338 [ZJOI2014]力 题目描述 给出n个数qi,给出Fj的定义如下: \[F_j = \sum_{i<j}\frac{q_i q_j}{(i-j)^2 }-\sum_ ...

  3. bzoj3527: [Zjoi2014]力 fft

    bzoj3527: [Zjoi2014]力 fft 链接 bzoj 思路 但是我们求得是 \(\sum\limits _{i<j} \frac{q_i}{(i-j)^2}-\sum_{i> ...

  4. 洛谷 P3338 [ZJOI2014]力 解题报告

    P3338 [ZJOI2014]力 题目描述 给出n个数qi,给出Fj的定义如下: \(F_j = \sum_{i<j}\frac{q_i q_j}{(i-j)^2 }-\sum_{i>j ...

  5. 【BZOJ 3527】 3527: [Zjoi2014]力 (FFT)

    3527: [Zjoi2014]力 Time Limit: 30 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 2003  Solved: 11 ...

  6. P3338 [ZJOI2014]力(FFT)

    题目 P3338 [ZJOI2014]力 做法 普通卷积形式为:\(c_k=\sum\limits_{i=1}^ka_ib_{k-i}\) 其实一般我们都是用\(i=0\)开始的,但这题比较特殊,忽略 ...

  7. [Luogu P3338] [ZJOI2014]力 (数论 FFT 卷积)

    题面 传送门: 洛咕 BZOJ Solution 写到脑壳疼,我好菜啊 我们来颓柿子吧 \(F_j=\sum_{i<j}\frac{q_i*q_j}{(i-j)^2}-\sum_{i>j} ...

  8. 笔记-[ZJOI2014]力

    [ZJOI2014]力 \[\begin{split} E_j=&\sum_{i=1}^{j-1}\frac{q_i}{(i-j)^2}-\sum_{i=j+1}^{n}\frac{q_i}{ ...

  9. [ZJOI2014]力 题解

    题目地址 洛谷P3338 Solution 第一道FFT的应用AC祭! 我们要求: \[E_j=\frac{F_j}{q_j}=\sum_{i<j}\frac{q_i}{(i-j)^2}-\su ...

随机推荐

  1. C# WebApi日期格式化

    WebApi中日期格式化:在WebApiConfig文件中加入如下代码即可,之前遇到的问题,日期中总带有T,现在记录一下解决的方法. 代码: private static void ReturnDat ...

  2. 修改NPM默认全局安装路径

    场景: 最近在新电脑上鼓捣完环境后,打算切换下源,结果使用全局安装的nrm时提示找不到命令,之前都是这么用现在怎么不行了呢? 排查过程: 于是各种折腾,发现- g安装的插件目录在C盘中的某个路径中,后 ...

  3. 高德地图API-设置考勤范围

    <template> <div class="page-setting-setgps"> <!--head--> <div class=& ...

  4. httpclient 多附件上传

    多附件上传实例: /** * 多附件上传 * @param host * @param uri * @param attachment 附件 * @param param body参数 * @retu ...

  5. ASE19团队项目alpha阶段model组 scrum1 记录

    本次会议于11月1日,19时整在微软北京西二号楼13478召开,持续15分钟. 与会人员:Jiyan He, Kun Yan, Lei Chai, Linfeng Qi, Xueqing Wu, Yu ...

  6. fastadmin中关联表时A为主表,想让B表和C表关联时怎么办?

    $sql = Db::connect('数据库')->table('C表')->where('status', 'normal')->field('字段 别称[不可与其他表重复]') ...

  7. RHEL6使用系统自带多路径软件配置多路径

    1.多路径的主要功能 多路径一般配合存储设备实现如下功能: 故障的切换和恢复  IO流量的负载均衡  磁盘的虚拟化     2.查看系统自带的多路径软件是否安装 [root@cluster01 ~]# ...

  8. 数据结构---->数组

    1.什么是数组? 数组是一种线性的数据结构.它同一组连续的内存空间,来存储一组具有相同类型的数据. 简单说明几点: (1).线性表:就是数据排成像一条线一样的结构.每个线性表的数据最多只有前和后两个方 ...

  9. OSI七层协议模型、TCP/IP四层模型

    OSI七层协议模型 TCP/IP四层模型 首先我们梳理一下每层模型的职责: 链路层:对0和1进行分组,定义数据帧,确认主机的物理地址,传输数据: 网络层:定义IP地址,确认主机所在的网络位置,并通过I ...

  10. PAT Basic 1022 D进制的A+B (20 分)

    输入两个非负 10 进制整数 A 和 B (≤),输出 A+B 的 D (1)进制数. 输入格式: 输入在一行中依次给出 3 个整数 A.B 和 D. 输出格式: 输出 A+B 的 D 进制数. 输入 ...