【BZOJ3527】[ZJOI2014] 力(FFT)
题目:
分析:
FFT应用第一题……
首先很明显能把\(F_j\)约掉,变成:
\]
然后去膜拜题解,我们知道两个多项式相乘的方式如下:
\]
那么,如果把\(E_j\)的表达式化成上面那个形式,就可以用FFT计算了。(不会FFT?戳我:【知识总结】快速傅里叶变换(FFT))
先看减号前面的部分。显然可以变成(为了叙述方便,读入的\(q\)的下标为\([0,n)\)):
\]
其中\(F_i=q_i\),\(G_i=\frac{1}{i^2}\)。特别地,\(G_0=0\)。
减号后面要处理\(j\)位置以后的,怎么办?大力把\(q\)数组翻过来,这样就相当于求\(n-j-1\)以前的了:
\]
其中\(F'_j=q_{n-j-1}\)
那么答案\(E_j=C_j-D_{n-j-1}\)
代码:
注意\(g\)要初始化……
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <cmath>
using namespace std;
#define _ 0
namespace zyt
{
template<typename T>
inline void read(T &x)
{
char c;
bool f = false;
x = 0;
do
c = getchar();
while (c != '-' && !isdigit(c));
if (c == '-')
f = true, c = getchar();
do
x = x * 10 + c - '0', c = getchar();
while (isdigit(c));
if (f)
x = -x;
}
inline void read(double &x)
{
scanf("%lf", &x);
}
template<typename T>
inline void write(T x)
{
static char buf[20];
char *pos = buf;
if (x < 0)
putchar('-'), x = -x;
do
*pos++ = x % 10 + '0';
while (x /= 10);
while (pos > buf)
putchar(*--pos);
}
inline void write(const double a, const int fix = 9)
{
printf("%.*f", fix, a);
}
const int B = 17, N = 1 << (B + 1) | 10;
const double PI = 3.141592653589793238462643383279502884197169399375105820974944L;
namespace FFT
{
int rev[N];
struct cpx
{
double x, y;
cpx(const double _x = 0.0, const double _y = 0.0)
: x(_x), y(_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);
}
cpx operator * (const cpx &b) const
{
return cpx(x * b.x - y * b.y, x * b.y + y * b.x);
}
cpx conj() const
{
return cpx(x, -y);
}
}omega[N], inv[N];
void init(const int lg2)
{
for (int i = 0; i < (1 << lg2); i++)
{
rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (lg2 - 1));
omega[i] = cpx(cos(2 * PI * i / (1 << lg2)), sin(2 * PI * i / (1 << lg2)));
inv[i] = omega[i].conj();
}
}
void fft(cpx *a, const int n, const cpx *w)
{
for (int i = 0; i < n; i++)
if (i < rev[i])
swap(a[i], a[rev[i]]);
for (int len = 1; len < n; len <<= 1)
for (int i = 0; i < n; i += (len << 1))
for (int k = 0; k < len; k++)
{
cpx tmp = a[i + k] - w[k * (n / (len << 1))] * a[i + len + k];
a[i + k] = a[i + k] + w[k * (n / (len << 1))] * a[i + len + k];
a[i + len + k] = tmp;
}
}
void solve(cpx *a, cpx *b, const int n)
{
fft(a, n, omega), fft(b, n, omega);
for (int i = 0; i < n; i++)
a[i] = a[i] * b[i];
fft(a, n, inv);
for (int i = 0; i < n; i++)
a[i].x /= n;
}
}
using namespace FFT;
int n;
double q[N];
cpx f[N], g[N], revf[N];
int work()
{
read(n);
for (int i = 0; i < n; i++)
{
read(q[i]);
f[i] = revf[n - i - 1] = q[i];
}
int m = n << 1, lg2 = 0;
for (n = 1; n < m; n <<= 1)
++lg2;
init(lg2);
for (int i = 0; i < (m >> 1); i++)
g[i] = (i ? 1.0 / ((double)i * i) : 0.0);
solve(f, g, n);
for (int i = 0; i < (m >> 1); i++)
g[i] = (i ? 1.0 / ((double)i * i) : 0.0);
for (int i = (m >> 1); i < n; i++)
g[i] = 0;
solve(revf, g, n);
for (int i = 0; i < (m >> 1); i++)
write(f[i].x - revf[(m >> 1) - i - 1].x), putchar('\n');
return ~~(0^_^0);
}
}
int main()
{
return zyt::work();
}
【BZOJ3527】[ZJOI2014] 力(FFT)的更多相关文章
- bzoj3527: [Zjoi2014]力 fft
bzoj3527: [Zjoi2014]力 fft 链接 bzoj 思路 但是我们求得是 \(\sum\limits _{i<j} \frac{q_i}{(i-j)^2}-\sum_{i> ...
- [BZOJ3527][ZJOI2014]力 FFT+数学
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3527 首先卷积的形式是$h(i)=\sum_{i=0}^jf(i)g(i-j)$,如果我们 ...
- BZOJ3527[Zjoi2014]力——FFT
题目描述 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. 输入 第一行一个整数n. 接下来n行每行输入一个数,第i行表示qi. n≤100000,0<qi<100000 ...
- [bzoj3527][Zjoi2014]力_FFT
力 bzoj-3527 Zjoi-2014 题目大意:给定长度为$n$的$q$序列,定义$F_i=\sum\limits_{i<j}\frac{q_iq_j}{(i-j)^2}-\sum\lim ...
- 【BZOJ-3527】力 FFT
3527: [Zjoi2014]力 Time Limit: 30 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 1544 Solved: 89 ...
- 【BZOJ】3527: [Zjoi2014]力 FFT
[参考]「ZJOI2014」力 - FFT by menci [算法]FFT处理卷积 [题解]将式子代入后,化为Ej=Aj-Bj. Aj=Σqi*[1/(i-j)^2],i=1~j-1. 令f(i)= ...
- P3338 [ZJOI2014]力(FFT)
题目 P3338 [ZJOI2014]力 做法 普通卷积形式为:\(c_k=\sum\limits_{i=1}^ka_ib_{k-i}\) 其实一般我们都是用\(i=0\)开始的,但这题比较特殊,忽略 ...
- 【bzoj3527】[Zjoi2014]力 FFT
2016-06-01 21:36:44 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3527 我就是一个大傻叉 微笑脸 #include&l ...
- bzoj3527: [Zjoi2014]力 卷积+FFT
先写个简要题解:本来去桂林前就想速成一下FFT的,结果一直没有速成成功,然后这几天断断续续看了下,感觉可以写一个简单一点的题了,于是就拿这个题来写,之前式子看着别人的题解都不太推的对,然后早上6点多推 ...
- 2019.02.28 bzoj3527: [Zjoi2014]力(fft)
传送门 fftfftfft菜题. 题意简述:给一个数列aia_iai,对于i=1→ni=1\rightarrow ni=1→n求出ansi=∑i<jai(i−j)2−∑i>jai(i−j ...
随机推荐
- 将登录代码模块化,然后用add address接口来调用它,success!
登录模块,单独写成mylogin()方法,保存为modeltry119.py,然后接口的文件只写接口, 在post请求时,引用mylogin()返回的cookies就好了. requests.post ...
- this与const
在普通非const成员函数中,this是const指针,而在const成员函数中,this是const对象的const指针. class Foo { Foo& get_self1(void) ...
- 小数化分数的O(log2n)解法
具体约束: 给定一个小数x,x满足0<=x<1,且保证给定的x保留了18位小数 输出一个分数,使得分母不超过1e9,分子分母互质,且在满足这些条件的情况下最接近x 了解一下法雷数列和ste ...
- Java基础学习总结(76)——Java异常深入学习研究
异常机制是指当程序出现错误后,程序如何处理.具体来说,异常机制提供了程序退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器. 异常处理的流程 当程序中抛 ...
- java json数据转List对象的集合-----阿里巴巴插件---及原生json---JSON 与 对象 、集合 之间的转换 JSON字符串和java对象的互转【json-lib】
List<RunfastFullLess> list=(List<RunfastFullLess>)JSONArray.parseObject(activity.getFull ...
- [luoguP2949] [USACO09OPEN]工作调度Work Scheduling(贪心 + 优先队列)
传送门 这个题类似于建筑抢修. 先按照时间排序. 如果当前时间小于任务截止时间就选, 否则,看看当前任务价值是否比已选的任务的最小价值大, 如果是,就替换. 可以用优先队列. ——代码 #includ ...
- Codeforces Round #228 (Div. 2)
做codeforces以来题目最水的一次 A题: Fox and Number Game 题意:就是用一堆数字来回减,直到减到最小值为止,再把所有最小值加,求这个值 sol: 简单数论题目,直接求所有 ...
- 利用async和await异步操作解决node.js里面fs模块异步读写,同步结果的问题
async await 解决异步问题,这两个关键字是es7提出的,所以测试,node和浏览器版本提高一些 async await 操作基于promise实现的 async await这两个关键字是一起 ...
- codevs1009 产生数
题目描述 Description 给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15). 规则: 一位数可变换成另一个一位数: 规则的右部不能为零. 例如:n=234.有规 ...
- my first emacs custom key binding
(defun comment-this-level () (interactive) (move-beginning-of-line 1) (set-mark-command nil) (fo ...