http://www.lydsy.com/JudgeOnline/problem.php?id=3527

好好的一道模板题,我自己被自己坑了好久。。

首先题目看错。。。。。。。什么玩意。。。。。。。首先题目要求:

$$F_j=\sum_{i<j} \frac{q_i q_j}{(i-j)^2}-\sum_{i>j} \frac{q_i q_j}{(i-j)^2}$$

然后设

$$E_i=\frac{F_i}{q_i}$$

然后我将$F_j$看成$F_i$。。。。作死系列。。。。。。

然后fft写错一个地方查错。。。。

然后第二次调用fft忘记清空。。。查错。。。(完全忘记虚数也要初始化啊!!!!!!!!!!!!!!!!!!!!!!!!!!!)

虽然说调用完dft-1时,虚数部分是0,但是你知道有精度这个东西。。。。。。。。。。。。。。。。。。。

一直以为是double精度的问题?????????????????????????????????????

原来本来就是精度问题。。。。。。。。。。。。。。。。。。。。。。。。。。。。

首先我们来分析$E_i$

展开可得:

$$E_i=\sum_{j<i} \frac{q_j}{(j-i)^2}-\sum_{j>i} \frac{q_j}{(j-i)^2}$$

(注意i和j都变了23333333333

然后再变化一下:

$$E_i=\sum_{j=1}^{i-1} \frac{q_j}{(j-i)^2} - \sum_{j=i+1}^{n} \frac{q_j}{(j-i)^2}$$

似乎不能看出什么?但是应该根据数据范围以及i和j,我们应该可以想想:卷积。。

然后设$f[i]=q_i, g[i]=\frac{1}{i^2}$,原式可以化为

$$E_i=\sum_{j=1}^{i-1} f[j]g[i-j] - \sum_{j=i+1}^{n} f[j]g[j-i]$$

发现卷积的形式是

$$c_i=\sum_{j=0}^{i} a_j b_{i-j}$$

似乎就是j的初值不同?

两种方法:一是将读入的$q_i$按0~n-1存储,二是像我这样做。

首先学习了《具体数学》中的和式级数,发现我是多么的sb。。

首先左边的卷积显然,上下界可以去掉,我们只来说右边:

$$\sum_{j=i+1}^{n} f[j]g[j-i]$$

其实应该这样写好理解。。

$$\sum_{i<j<=n} f[j]g[j-i]$$

然后直接换元(具体数学里称交换律。。

$$\sum_{i<j+i<=n} f[j+i]g[j+i-i]$$

然后再处理一下得

$$\sum_{0<=j<=n-i} f[j+i]g[j]$$

然后再处理一下。(上式=0是因为不影响,即g[0]=0)

$$\sum_{0<=n-i-j<=n-i} f[n-i-j+i]g[n-i-j]$$

变成

$$\sum_{0<=j<=n-i} f[n-j]g[n-i-j]$$

设$t=n-i$,则

$$\sum_{0<=j<=t} f[n-j]g[t-j]$$

设$f'[j]=f[n-j]$

$$\sum_{0<=j<=t} f'[j]g[t-j]$$

囧。。。一写下来发现也很麻烦?手推的时候很多步都可以省略吧。。。

//以下的作废,因为太复杂了。。。。。。233

首先j=0的话,我们可以将f[0]=0就行了嘛。。。i-1我们可以g[0]=0就好了嘛。同理j=i+1也能化成j=i

那么原式变成

$$E_i=\sum_{j=0}^{i} f[j]g[i-j] - \sum_{j=i}^{n} f[j]g[j-i]$$

发现右边还不行?特殊的技巧。。。减法。。

于是

$$E_i=\sum_{j=0}^{i} f[j]g[i-j] - \sum_{j=0}^{n-i} f[n-j]g[(n-j)-i]$$

设$ff[j]=f[n-j]$,那么

$$E_i=\sum_{j=0}^{i} f[j]g[i-j] - \sum_{j=0}^{n-i} ff[j]g[n-i-j]$$

然后设向量A和B,那么

$$A[i]=\sum_{j=0}^{i} f[j]g[i-j]$$

$$B[i]=\sum_{j=0}^{i} ff[j]g[i-j]$$

所以

$$E_i=A[i]-B[n-i]$$

//以上的作废

然后A和B用卷积算出来即可。。

还有一个要注意的地方,数组要开大点,就是(2*n+1)*2这样。。。。。。。。否则。。。。。。。。。。。。。。。。。。

(另,这是spj)

#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <vector>
#include <map>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
#define mkpii make_pair<int, int>
#define pdi pair<double, int>
#define mkpdi make_pair<double, int>
#define pli pair<ll, int>
#define mkpli make_pair<ll, int>
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << (#x) << " = " << (x) << endl
#define error(x) (!(x)?puts("error"):0)
#define printarr2(a, b, c) for1(_, 1, b) { for1(__, 1, c) cout << a[_][__]; cout << endl; }
#define printarr1(a, b) for1(_, 1, b) cout << a[_] << '\t'; cout << endl
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; }struct cp {double r, i;cp(long double _r=0.0, double _i=0.0) : r(_r), i(_i) { }cp operator+ (const cp &x) { return cp(r + x.r, i + x.i); }cp operator- (const cp &x) { return cp(r - x.r, i - x.i); }cp operator* (const cp &x) { return cp(r*x.r - i*x.i, r*x.i + i*x.r); }
};
const int N=400005;
const double PI=acos(-1.0);
cp A[N];
int rev[N];
void dft(cp *a, int n, int flag) {rep(i, n) A[rev[i]]=a[i];rep(i, n) a[i]=A[i];for(int m=2; m<=n; m<<=1) {cp wn(cos(2.0*PI/m*flag), sin(2.0*PI/m*flag));for(int i=0; i<n; i+=m) {cp w(1.0); int mid=(m>>1);for(int j=0; j<mid; ++j) {cp u=a[i+j+mid]*w, t=a[i+j];a[i+j]=t+u;a[i+j+mid]=t-u;w=w*wn;}}}if(flag==-1) rep(i, n) a[i].r/=n;
}
void init(int &len) {int k=1, l=0;while(k<len) k<<=1, ++l;len=k;rep(i, len) {int t=i, r=0; k=l;while(k--) r<<=1, r|=(t&1), t>>=1;rev[i]=r;}
}
void fft(double *x, double *y, cp *a, cp *b, cp *c, int len) {rep(i, len) a[i].r=x[i], a[i].i=0.0; //虚数不初始化就是作死rep(i, len) b[i].r=y[i], b[i].i=0.0;dft(a, len, 1); dft(b, len, 1);rep(i, len) c[i]=a[i]*b[i];dft(c, len, -1);
}
int n, len;
double g[N], f[N], ff[N], ans[N];
cp a[N], b[N];
int main() {read(n); len=n*2+1;init(len);for1(i, 1, n) scanf("%lf", &f[i]);for1(i, 1, n) g[i]=1.0/i/i;for1(i, 0, n) ff[i]=f[n-i];fft(f, g, a, b, a, len);for1(i, 1, n) ans[i]=a[i].r;fft(ff, g, a, b, a, len);for1(i, 1, n) ans[i]-=a[n-i].r;for1(i, 1, n) printf("%.3f\n", ans[i]);return 0;
}

  


Description

给出n个数qi,给出Fj的定义如下: 
 
令Ei=Fi/qi,求Ei.

Input

第一行一个整数n。 
接下来n行每行输入一个数,第i行表示qi。

Output

n行,第i行输出Ei。 
与标准答案误差不超过1e-2即可。

Sample Input

5
4006373.885184
15375036.435759
1717456.469144
8514941.004912
1410681.345880

Sample Output

-16838672.693
3439.793
7509018.566
4595686.886
10903040.872

Hint

对于30%的数据,n≤1000。 
对于50%的数据,n≤60000。 
对于100%的数据,n≤100000,0<qi<1000000000。

Source

感谢nodgd放题

【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)

    题目链接 \(Descripiton\) 给出\(q[\ ]\),\[F[j]=\sum_{i<j}\frac{q_iq_j}{(i-j)^2}-\sum_{i>j}\frac{q_iq_ ...

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

    题意 给出\(n\)个数\(q_i\),给出\(Fj\)的定义如下: \[F_j=\sum \limits _ {i < j} \frac{q_iq_j}{(i-j)^2}-\sum \limi ...

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

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

  5. BZOJ 3527: [Zjoi2014]力

    题目地址:http://www.lydsy.com/JudgeOnline/problem.php?id=3527 题目大意:见原题. 算法讨论: 设A[i]=q[i],B[i]=1/(i^2). 设 ...

  6. BZOJ 3527 [Zjoi2014] 力

    Description 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. Input 第一行一个整数n. 接下来n行每行输入一个数,第i行表示qi. n≤100000,0<qi ...

  7. P3338 [ZJOI2014]力 FFT + 推式子

    传送门 文章目录 题意: 思路: 题意: 思路: 这个式子看起来很FFTFFTFFT,让我们来化简一下. 考虑EEE中直接将qiq_iqi​约掉,所以Ei=∑j=1i−1qj(i−j)2−∑j=i+1 ...

  8. P3338 [ZJOI2014]力 [FFT]

    P3338[ZJOI2014]力P3338 [ZJOI2014]力P3338[ZJOI2014]力 给出n个数qi,给出Fj的定义如下: Fj=∑i<jqiqj(i−j)2−∑i>jqiq ...

  9. BZOJ3527: [Zjoi2014]力 [FFT]

    化简之后,发现减号左边的式子是一个卷积.右边的式子,把一个函数倒序就是卷积,分别FFT,求解答案. 大佬blog: https://blog.csdn.net/kyleyoung_ymj/articl ...

最新文章

  1. 【面试题】Spring框架中Bean的生命周期
  2. @RequestMapping
  3. python基础03——数据类型string
  4. 120分的转录组试题,你能得多少
  5. 算法设计 分治, 归并排序, 快速排序
  6. cent os 7 与cent os 6 修改主机名称
  7. java数组元素的输入_java基础--键盘输入一个数,输出数组中指定元素
  8. M文件---脚本与函数
  9. 我们聊聊快排吧...
  10. Android系统证书 platform.x509.pem platform.pk8转换为.keystore文件
  11. 无人驾驶相关文献阅读体会
  12. 国内HTML5前端开发框架汇总
  13. 十二进制转十进制(n进制转十进制也一样)
  14. css交集选择器的使用
  15. win10修改用户名_忘记登录密码没有U盘怎么办?无U盘重置密码Win10篇
  16. 怪物的生成 攻击和掉落金币
  17. 汇编语言课程设计动态图形设计小车动态图形
  18. 如何使用UUP来下载Windows 10 的安装镜像(Windows篇)
  19. 华为笔试题2020(3月11日)
  20. 05——驾校科目一考试系统——验证账号密码

热门文章

  1. php设置背景图片的代码,css设置背景图片如何实现?(代码实例)
  2. Centos7安装Elasticsearch
  3. Mac Os 基本命令行
  4. jQuery 变量数字相加
  5. java第5天_java第5天的代码
  6. java正则表达式的用法_Java 正则表达式的使用
  7. sql mysql 删除数据库_在sql中将已建数据库删除的详细步骤
  8. js中的if与Java中的if_JavaScript if...else 语句
  9. C语言打印等腰三角形
  10. linux 下/proc/cpuinfo三级缓存,linux /proc/cpuinfo文件分析