3527: [Zjoi2014]力 - BZOJ

题目大意:给出n个数qi,定义 Fj为

令 Ei=Fi/qi,求Ei。

看了很久题解,终于有些眉目,因为知道要用FFT,所以思路就很直了

其实我们就是要±1/(j-i)^2 ( i-j大于0时为正,小于0时为负 ) 和 qi 的乘积要算到j这个位置上,这个满足卷积,所以用FFT优化,但是j-i有负数,所以我们就加上一个n

于是设pi={

i>n,1/(i-n)^2

i<n,-1/(n-i)^2

其他,0

}

然后就套FFT模板就行了

 1 const
 2     maxn=800100;
 3 type
 4     cp=record
 5         x,y:double;
 6     end;
 7     arr=array[0..maxn]of cp;
 8 var
 9     a,b,w,tt:arr;
10     n,m:longint;
11
12 operator -(a,b:cp)c:cp;
13 begin
14     c.x:=a.x-b.x;
15     c.y:=a.y-b.y;
16 end;
17
18 operator +(a,b:cp)c:cp;
19 begin
20     c.x:=a.x+b.x;
21     c.y:=a.y+b.y;
22 end;
23
24 operator *(a,b:cp)c:cp;
25 begin
26     c.x:=a.x*b.x-a.y*b.y;
27     c.y:=a.x*b.y+a.y*b.x;
28 end;
29
30 procedure dft(var a:arr;s,t:longint);
31 var
32     i,p:longint;
33     wt:cp;
34 begin
35     if n>>t=1 then exit;
36     dft(a,s,t+1);dft(a,s+1<<t,t+1);
37     for i:=0 to n>>t>>1-1 do
38         begin
39             p:=i<<t<<1+s;
40             wt:=w[i<<t]*a[p+1<<t];
41             tt[i]:=a[p]+wt;
42             tt[i+n>>t>>1]:=a[p]-wt;
43         end;
44     for i:=0 to n>>t-1 do
45         a[s+i<<t]:=tt[i];
46 end;
47
48 procedure main;
49 var
50     i:longint;
51 begin
52     read(m);
53     for i:=0 to m-1 do read(a[i].x);
54     for i:=1 to m-1 do b[i].x:=-1/(m-i)/(m-i);
55     for i:=m+1 to m<<1-1 do b[i].x:=1/(i-m)/(i-m);
56     n:=1;
57     while n<m<<1 do n:=n<<1;
58     for i:=0 to n-1 do w[i].x:=cos(pi*2*i/n);
59     for i:=0 to n-1 do w[i].y:=sin(pi*2*i/n);
60     dft(a,0,0);dft(b,0,0);
61     for i:=0 to n-1 do a[i]:=a[i]*b[i];
62     for i:=0 to n-1 do w[i].y:=-w[i].y;
63     dft(a,0,0);
64     for i:=m to m<<1-1 do writeln(a[i].x/n:0:3);
65 end;
66
67 begin
68     main;
69 end.

3527: [Zjoi2014]力 - BZOJ

时间: 2024-12-14 02:49:30

3527: [Zjoi2014]力 - BZOJ的相关文章

BZOJ 3527: [Zjoi2014]力 [快速傅里叶变换]

3527: [Zjoi2014]力 Time Limit: 30 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 1723  Solved: 1015[Submit][Status][Discuss] Description 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. Input 第一行一个整数n. 接下来n行每行输入一个数,第i行表示qi. n≤100000,0<qi<1000000000 Output n行,第i

BZOJ 3527: [Zjoi2014]力 FFT

3527: [Zjoi2014]力 Description 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. Input 第一行一个整数n. 接下来n行每行输入一个数,第i行表示qi. n≤100000,0<qi<1000000000 Output n行,第i行输出Ei.与标准答案误差不超过1e-2即可. Sample Input 5 4006373.885184 15375036.435759 1717456.469144 8514941.004912 1410681.34

【BZOJ】3527: [Zjoi2014]力 FFT

[参考]「ZJOI2014」力 - FFT by menci [算法]FFT处理卷积 [题解]将式子代入后,化为Ej=Aj-Bj. Aj=Σqi*[1/(i-j)^2],i=1~j-1. 令f(i)=qi,g(i)=1/i^2,定义f(0)=g(0)=0(方便卷积). Aj=Σf(i)*g(j-i),i=0~j-1,标准的卷积形式. 而对于Bj,将g反转后就是和为i+n-1的标准卷积形式了. 第一次FFT后,记得对a数组后半部分清零后再进行第二次FFT. 复杂度O(n log n). #incl

bzoj 3527: [Zjoi2014]力

都说这是个FFT模板题 可我这种蒟蒻还是看了大半天... 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<queue> 7 #include<algorithm> 8 #include<vector> 9 #include<complex

[BZOJ 3527][Zjoi2014]力(FFT)

Description 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. Solution 设fi=qi gi=1/i/i(这里如果写成i*i可能会爆int) 那前半部分就是∑fi*gj-i 发现是一个卷积的形式 后半部分把数组反一下同理 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #define

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

题目在这里:http://wenku.baidu.com/link?url=X4j8NM14MMYo8Q7uPE7-7GjO2_TXnMFA2azEbBh4pDf7HCENM3-hPEl4mzoe2wSoblrSOvMirfS7PsQ1OVjsdaCJhEaGNCpuUxFKoPvNvXa 裸的FFT,小心i*i爆int!!! 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #includ

bzoj 3527: [Zjoi2014]力【FFT】

大力推公式,目标是转成卷积形式:\( 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<

3527: [Zjoi2014]力

题目大意:给出n个数qi,定义 Fj为 令 Ei=Fi/qi,求Ei. 设A[i]=q[i],B[i]=1/(i^2). 设C[i]=sigma(A[j]*B[i-j]),D[i]=sigma(A[n-j-1]*B[i-j]). 那么所求的E[i]=C[i]-D[i]. 不难发现C[i]已经是标准的卷积形式了,用FFT即可. 对于D[i],令A'[i]=A[n-i-1],那么D[i]=sigma(A[j]*B[i-j]),于是也用FFT即可. code: 1 #include<cstdio>

【BZOJ 3527】 [Zjoi2014]力

3527: [Zjoi2014]力 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 -16838