大力推公式,目标是转成卷积形式:\( C_i=\sum_{j=1}^{i}a_jb_{i-j} \)

首先下标从0开始存,n--

\[F_i=\frac{\sum_{j<i}\frac{q_jq_i}{(j-i)^2}-\sum_{j>i}\frac{q_jq_i}{(j-i)^2}}{q_i}
\]

\[F_i=\sum_{j<i}\frac{q_j}{(j-i)^2}-\sum_{j>i}\frac{q_j}{(j-i)^2}
\]

\[a_i=\sum_{j<i}\frac{q_j}{(j-i)^2}
\]

\[b_i=\sum_{j>i}\frac{q_j}{(j-i)^2}
\]

\[f_j=F_j
\]

\[g_i=\frac{1}{i^2}
\]

\[F_i=a_i-b_i
\]

先推ai

!注意j==i的情况下g函数为0不影响结果,所以方便起见把大于小于都换成了大于等于小于等于

\[a_i=\sum_{j<i}\frac{q_j}{(j-i)^2}
\]

\[=\sum_{j=0}^{i}\frac{q_j}{(i-j)^2}
\]

\[=\sum_{j=0}^{i}f_i*g_{i-j}
\]

于是卷积*1get

再推bi

\[b_i=\sum_{j>i}\frac{q_j}{(j-i)^2}
\]

\[=\sum_{j=i}^{n}\frac{q_j}{(j-i)^2}
\]

然后用j+i替换j

\[=\sum_{j+i=i}^{n}\frac{q_{j+i}}{(j+i-i)^2}
\]

\[=\sum_{j=0}^{n-i}\frac{q_{j+i}}{j^2}
\]

\[=\sum_{j=0}^{n-i}f_{j+i}*g_j
\]

然后用n-i-j替换j

\[=\sum_{n-i-j=0}^{n-i}f_{n-i-j+i}*g_{n-i-j}
\]

\[=\sum_{0 \leq n-i-j \leq n-i}f_{n-i-j+i}*g_{n-i-j}
\]

然后发现这样转化一下

\[0 \leq n-i-j\Rightarrow j \leq n-i
\]

\[n-i-j \leq n-i\Rightarrow 0 \leq j
\]

\[=\sum_{j=0}^{n-i}f_{n-j}*g_{n-i-j}
\]

\[f1_i=f_{n-i}
\]

\[=\sum_{j=0}^{n-i}f1_j*g_{n-i-j}
\]

\[t=n-i
\]

\[=\sum_{j=0}^{t}f1_j*g_{t-j}
\]

于是卷积*2get

然后直接上FFT即可

!!!对于g函数,应该是g[i]=1.0/i/i !!g[i]=1.0/(i*i)会炸精度!

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int N=1000005;
int n,lm,bt,re[N];
struct cd
{
double r,i;
cd(double R=0,double I=0)
{
r=R,i=I;
}
cd operator + (cd &a) const
{
return cd(r+a.r,i+a.i);
}
cd operator - (cd &a) const
{
return cd(r-a.r,i-a.i);
}
cd operator * (cd &a) const
{
return cd(r*a.r-i*a.i,r*a.i+i*a.r);
}
}f[N],f1[N],g[N],a[N],b[N];
void dft(cd a[],int f)
{
for(int i=1;i<lm;i++)
if(i<re[i])
swap(a[i],a[re[i]]);
for(int i=2;i<=lm;i<<=1)
{
cd wi=cd(cos(2.0*M_PI/i),f*sin(2.0*M_PI/i));
for(int k=0;k<lm;k+=i)
{
cd w=cd(1,0),x,y;
for(int j=0;j<(i>>1);j++)
{
x=a[j+k];
y=a[j+k+(i>>1)]*w;
a[j+k]=x+y;
a[j+k+(i>>1)]=x-y;
w=w*wi;
}
}
}
if(f==-1)
for(int i=0;i<lm;i++)
a[i].r/=lm;
}
int main()
{
scanf("%d",&n);
n--;
for(int i=0;i<=n;i++)
{
scanf("%lf",&f[i].r);
f1[n-i].r=f[i].r;
}
for(int i=1;i<=n;i++)
g[i].r=1.0/i/i;
for(int i=0;;i++)
if((1<<i)>2*n)
{
bt=i;
lm=(1<<i);
break;
}
for(int i=0;i<lm;i++)
re[i]=(re[i>>1]>>1)|((i&1)<<(bt-1));
dft(f,1);
dft(f1,1);
dft(g,1);
for(int i=0;i<lm;i++)
{
a[i]=f[i]*g[i];
b[i]=f1[i]*g[i];
}
dft(a,-1);
dft(b,-1);
for(int i=0;i<=n;i++)
printf("%.3f\n",a[i].r-b[n-i].r);
return 0;
}

bzoj 3527: [Zjoi2014]力【FFT】的更多相关文章

  1. bzoj 3527 [Zjoi2014]力——FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3527 把 q[ i ] 除掉.设 g[ i ] = i^2 ,有一半的式子就变成卷积了:另一 ...

  2. bzoj 3527 [Zjoi2014] 力 —— FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3527 看了看TJ才推出来式子,还是不够熟练啊: TJ:https://blog.csdn.n ...

  3. BZOJ 3527: [Zjoi2014]力(FFT)

    我们看一下这个函数,很容易就把他化为 E=sigma(aj/(i-j)/(i-j))(i>j)-sigma(aj/(i-j)/(i-j))(j>i) 把它拆成两半,可以发现分子与分母下标相 ...

  4. BZOJ 3527 [Zjoi2014]力 ——FFT

    [题目分析] FFT,构造数列进行卷积,挺裸的一道题目诶. 还是写起来并不顺手,再练. [代码] #include <cmath> #include <cstdio> #inc ...

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

    [参考]「ZJOI2014」力 - FFT by menci [算法]FFT处理卷积 [题解]将式子代入后,化为Ej=Aj-Bj. Aj=Σqi*[1/(i-j)^2],i=1~j-1. 令f(i)= ...

  6. ●BZOJ 3527 [Zjoi2014]力

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3527 题解: FFT求卷积. $$\begin{aligned}E_i&=\frac ...

  7. BZOJ 3527: [ZJOI2014]力(FFT)

    BZOJ 3527: [ZJOI2014]力(FFT) 题意: 给出\(n\)个数\(q_i\),给出\(Fj\)的定义如下: \[F_j=\sum \limits _ {i < j} \fra ...

  8. 数学(FFT):BZOJ 3527 [Zjoi2014]力

    题目在这里:http://wenku.baidu.com/link?url=X4j8NM14MMYo8Q7uPE7-7GjO2_TXnMFA2azEbBh4pDf7HCENM3-hPEl4mzoe2w ...

  9. bzoj 3527: [Zjoi2014]力 快速傅里叶变换 FFT

    题目大意: 给出n个数\(q_i\)定义 \[f_i = \sum_{i<j}{\frac{q_iq_j}{(i-j)^2}} - \sum_{i>j}\frac{q_iq_j}{(i-j ...

随机推荐

  1. OC-category 为什么不能添加成员变量

    以下的答案是百度的,仅做记录而已: 1. 利用运行时实际上也不是添加成员变量.已编译的类的内存布局是不变的,Class就是一个结构体,里面的成员不能改变.但是通过运行时可以将一个对象或基础类型变成指定 ...

  2. ***apache做301重定向的方法

    将不带www的定向到带www去 方法一:加在httpd.conf 1.这里我使用mod_rewrite重写URL的方式来做,做之前朋友记得检查一下你的apache是否已经加载了rewrite模块.如图 ...

  3. PAT (Advanced Level) 1039. Course List for Student (25)

    map会超时,二分吧... #include<iostream> #include<cstring> #include<cmath> #include<alg ...

  4. 洛谷 P3807 【模板】卢卡斯定理

    P3807 [模板]卢卡斯定理 题目背景 这是一道模板题. 题目描述 给定n,m,p(1\le n,m,p\le 10^51≤n,m,p≤105) 求 C_{n+m}^{m}\ mod\ pCn+mm ...

  5. Oracle 用户表空间查看、修改大小、设置自增长等

      分类: Oracle 首先登入某个用户,查看某个用户在哪个表空间下: select username,default_tablespace from user_users; 查看该用户下所有的表: ...

  6. python执行系统命令的几种方法

    (1) os.system 这个方法是直接调用标准C的system() 函数,仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息. import os os.system('cat /pro ...

  7. 新手玩个人server(阿里云)续二

    小二班一番厮杀:那英四强诞生:大家闺秀,小家碧玉.窈窕淑女,妍姿俊俏 .不解释! ?不行! 陈冰,李嘉格,刘明湘.张碧晨.大多数的时候,仅仅要脸好看,一切都那么自热而然的顺理成章. 尽管网上骂声四起, ...

  8. vim配置为IDE环境(超详细,极力推荐 git)

    https://github.com/yangyangwithgnu/use_vim_as_ide 1. 用法 git clone https://github.com/VundleVim/Vundl ...

  9. Behavioral模式之Chain of Responsibility模式

    1.意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递改请求,知道有一个对象处理它为止. 2.别名 无 3.动机 考虑一个图形用户界面 ...

  10. HBase单机环境搭建

    在搭建HBase单机环境之前,首先你要保证你已经搭建好Java环境: $ java -version java version "1.8.0_51" Java(TM) SE Run ...