BZOJ3257 [Zjoi2014]力 多项式 FFT
原文链接http://www.cnblogs.com/zhouzhendong/p/8762639.html
题目传送门 - BZOJ3527
题意
给出长度为$m$的序列$q_{1..m}$,让你输出长度为$m$的序列$E_{1..m}$。
其中:
$$E_i=\sum_{j=1}^{i-1}\frac{q_j}{(i-j)^2}-\sum_{j=i+1}^{m}\frac{q_j}{(i-j)^2}$$
题解
我们设
$$f_i=q_i,g_i=\frac 1{i^2}(g_0=0,且对于i>m,g_i=0),f_i^r=f_{m-i}$$
于是:
$$E_i=\sum_{j=0}^i f_jg_{i-j}-\sum_{j=i}^m f_jg_{j-i}$$
这个式子的前一半是个裸的卷积,可以直接$FFT$。后一半要稍微变变。(有dalao说是两个裸的卷积!Orz)
$$\sum_{j=i}^m f_{j}g_{j-i}\\=\sum_{j=i}^{m}f_{m-j}^rg_{i-j}\\=\sum_{j=0}^{m-i}f_{m-i-j}^rg_{j}$$
令$i'=m-i$,则:
$$\sum_{j=0}^{m-i}f_{m-i-j}^rg_{j}\\=\sum_{j=0}^{i'}f_{i'-j}^rg_{j}\\=\sum_{j=0}^{i'}f_{j}^rg_{i'-j}$$
于是也是一个裸的卷积形式了。
但是这题我做了很久。QAQ。
一开始把$m$和$n$搞错,而且还很自信的认为是等价的。($n$见代码)
然后发现$IDFT$之后忘记把数字除以$n$了。
然后还是挂了。
然后看(%)了看(%)网上AC的代码,发现我和他唯一的区别就是他把$i>m$的$g_i$都搞成$0$,而我没搞,但是我仍然很自信的认为是对的QAQ。
最后把我的自信全部打翻,然后就突然A掉了QAQ。
代码
#include <bits/stdc++.h>
using namespace std;
const int N=1<<19;
int m,n,L,R[N];
double q[N],PI=acos(-1.0);
struct C{
double r,i;
C(){}
C(double a,double b){r=a,i=b;}
C operator + (C x){return C(r+x.r,i+x.i);}
C operator - (C x){return C(r-x.r,i-x.i);}
C operator * (C x){return C(r*x.r-i*x.i,i*x.r+r*x.i);}
}A[N],B[N],ans1[N],ans2[N],w[N];
void FFT(C a[]){
for (int i=0;i<n;i++)
if (i<R[i])
swap(a[i],a[R[i]]);
for (int d=1,t=n>>1;d<n;d<<=1,t>>=1)
for (int i=0;i<n;i+=(d<<1))
for (int j=0;j<d;j++){
C tmp=w[t*j]*a[i+j+d];
a[i+j+d]=a[i+j]-tmp;
a[i+j]=a[i+j]+tmp;
}
}
void FFT_times(C A[],C B[],C C[]){
FFT(A),FFT(B);
for (int i=0;i<n;i++)
w[i].i*=-1.0,C[i]=A[i]*B[i];
FFT(C);
for (int i=0;i<n;i++)
w[i].i*=-1.0,C[i].r/=n;
}
int main(){
scanf("%d",&m);
for (int i=1;i<=m;i++)
scanf("%lf",&q[i]);
for (n=1,L=0;n<m*2;n<<=1,L++);
for (int i=0;i<n;i++){
w[i]=C(cos(2*i*PI/n),sin(2*i*PI/n));
R[i]=(R[i>>1]>>1)|((i&1)<<(L-1));
A[i]=C(q[i],0);
B[i]=C((i==0||i>m)?0:1.0/i/i,0);
}
FFT_times(A,B,ans1);
for (int i=0;i<n;i++){
A[i]=C(i<=m?q[m-i]:0,0);
B[i]=C((i==0||i>m)?0:1.0/i/i,0);
}
FFT_times(A,B,ans2);
for (int i=1;i<=m;i++)
printf("%.3lf\n",ans1[i].r-ans2[m-i].r);
return 0;
}
BZOJ3257 [Zjoi2014]力 多项式 FFT的更多相关文章
- 【BZOJ 3527】 3527: [Zjoi2014]力 (FFT)
3527: [Zjoi2014]力 Time Limit: 30 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 2003 Solved: 11 ...
- [Luogu P3338] [ZJOI2014]力 (数论 FFT 卷积)
题面 传送门: 洛咕 BZOJ Solution 写到脑壳疼,我好菜啊 我们来颓柿子吧 \(F_j=\sum_{i<j}\frac{q_i*q_j}{(i-j)^2}-\sum_{i>j} ...
- [ZJOI2014] 力 - 多项式乘法 FFT
题意:给定 \({q_i}\),求 \[E_i = \sum_{i<j}{\frac{q_j}{(j-i)^2}} - \sum_{i>j}{\frac{q_j}{(j-i)^2}}\] ...
- BZOJ 3527: [ZJOI2014]力(FFT)
BZOJ 3527: [ZJOI2014]力(FFT) 题意: 给出\(n\)个数\(q_i\),给出\(Fj\)的定义如下: \[F_j=\sum \limits _ {i < j} \fra ...
- BZOJ3527 [Zjoi2014]力 【fft】
题目 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. 输入格式 第一行一个整数n. 接下来n行每行输入一个数,第i行表示qi. 输出格式 n行,第i行输出Ei.与标准答案误差不超过 ...
- 洛谷P3338 [ZJOI2014]力(FFT)
传送门 题目要求$$E_i=\frac{F_i}{q_i}=\sum_{j=1}^{i-1}\frac{q_j}{(i-j)^2}-\sum_{j=i+1}^n\frac{q_j}{(j-i)^2}$ ...
- 【BZOJ3527】[ZJOI2014] 力(FFT)
题目: BZOJ3527 分析: FFT应用第一题-- 首先很明显能把\(F_j\)约掉,变成: \[E_j=\sum _{i<j} \frac{q_i}{(i-j)^2}-\sum_{i> ...
- [BZOJ3527][ZJOI2014]力:FFT
分析 整理得下式: \[E_i=\sum_{j<i}{\frac{q_i}{(i-j)^2}}-\sum_{j>i}{\frac{q_i}{(i-j)^2}}\] 假设\(n=5\),考虑 ...
- 【BZOJ】3527: [Zjoi2014]力(fft+卷积)
http://www.lydsy.com/JudgeOnline/problem.php?id=3527 好好的一道模板题,我自己被自己坑了好久.. 首先题目看错.......什么玩意.......首 ...
随机推荐
- [BZOJ 4817] [SDOI 2017] 树点涂色
Description Bob有一棵 \(n\) 个点的有根树,其中 \(1\) 号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是:这条路径上的点(包括起点和终点 ...
- C. Multi-Subject Competition 思维+前缀和+填表加减复杂度(复杂度计算错误)
题意: 给出n个学生 m类题目 每个人会做s[i]类的题 并且做这个题的能力为r[i] 组成一个竞赛队 要求可以选择一些题目 在竞赛队中 擅长每一个题目的 人数要均等 求max(sigma(r[ ...
- SpringBoot2.0初识
核心特性 组件自动装配: Web MVC , Web Flux , JDBC 等 激活: @EnableAutoConfiguration 配置: /META_INF/spring.factories ...
- CentOS配置history记录每个用户执行过的命令
一个偶然的机会,看到了这个文档,先存下来,后续使用的话直接就加进去了 要记录登录者的用户名.IP.操作记录,在/etc/bashrc末尾加入几个环境变量,用于history命令显示用户ip等内容,完成 ...
- SEO总结
学习了这么久了seo,对学过的知识进行一下总结. 服务器和域名 首先的一个就是对服务器和域名的选择,服务器最好能是独立的,因为如果不是独立服务器很容易被别人放在服务器上的网站所影响,然后就是域名,需要 ...
- 第二节. SignalR开篇以及如何指定传输协议
一. 声明 该节主要介绍SignalR的一些理论知识,代码量很小,在后续章节编写中,会不断回来更新该节,完善该节的介绍:待该系列结束时,该节会和目录章节合并. 下面的理论介绍相对枯燥,但对于后面的理解 ...
- HEAD FILE
心血来潮做的沙雕Head,喜欢就拿去用吧,Explosion! HEAD //#pragma comment(linker, "/STACK:1024000000,1024000000&qu ...
- python中的转义字符
当我们需要在字符中添加特殊符号时,我们需要用\(即反斜杠来转义字符) 常用的转义字符: 注:如果不想转义添加的特殊字符,需要显示字符串原来的意思的时候,需要用r或R来定义 结果是这样的
- C# - 常用接口
常用接口 用于比较接口 IComparable<T> 接口内部定义了用于比较两个对象大小的CompareTo(T t)方法,>参数时返回1,=参数时返回0,<参数时返回-1.集 ...
- jdk生成https证书
最近由于客户现场做“等保”,其中有一条要求我们必须使用https进行web端的请求,之前我们一直沿用的是默认的http请求,用户说不安全,唉~~局域网,一直强调安全,安全,话不多说了 我采用的使用JA ...