【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 ...
随机推荐
- BZOJ 2806 Luogu P4022 [CTSC2012]Cheat (广义后缀自动机、DP、二分、单调队列)
题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=2806 (luogu) https://www.luogu.org/pro ...
- RabbitMQ-rabbitMq各个特性的使用(三)
准备 1.引入客户端和配置文件依赖类 <dependency> <groupId>com.rabbitmq</groupId> <artifactId> ...
- noip模拟赛 戏
[问题背景]zhx 和他的妹子(们) 做游戏.[问题描述]考虑 N 个人玩一个游戏,任意两个人之间进行一场游戏(共 N*(N-1)/2 场),且每场一定能分出胜负.现在, 你需要在其中找到三个人构成“ ...
- android从sdcard中读取bitmap
String sdcard_path=Environment.getExternalStorageDirectory().getCanonicalPath(); String file_path=sd ...
- springboot启动mybatis
初期开发了generator可以根据表结果自动生产实体类.配置文件和dao层代码,可以减轻一部分开发量:后期也进行了大量的优化可以使用注解了,自动管理dao层和配置文件等,发展到最顶端就是今天要讲的这 ...
- C++学习之extern "C"
我们知道,extern关键字可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.这里起到的是声明作用范围的用处.另外,extern还可以与 ...
- Linux网络编程:UDP Socket编程范例
TCP协议提供的是一种可靠的,复杂的,面向连接的数据流(SOCK_STREAM)传输服务,它通过三段式握手过程建立连接.TCP有一种"重传确认"机制,即接收端收到数据后要发出一个肯 ...
- Arduino程序-光敏电阻
尽管造书去做的.但还是有莫名的成就感 从串口显示出,电压变化, void setup() { // put your setup code here, to run once: Serial. ...
- Android 自己定义圆圈进度并显示百分比例控件(纯代码实现)
首先,感谢公司能给我闲暇的时间,来稳固我的技术,让我不断的去探索研究,在此不胜感激. 先不说实现功能,上图看看效果 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZ ...
- Oracle 用户管理(二)
1 给某人赋予"系统权限" SQL> grant connect to aobama with admin option 意思是将admin的连接数据库 ...