数学(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 #include <cmath>
 5 using namespace std;
 6 const int maxn=300010;
 7 const double PI=acos(-1.0);
 8 struct complex{
 9     double r,i;
10     complex(long double r_=0.0,long double i_=0.0){
11         r=r_;i=i_;
12     }
13     complex operator+(complex a){
14         return complex(r+a.r,i+a.i);
15     }
16     complex operator-(complex a){
17         return complex(r-a.r,i-a.i);
18     }
19     complex operator*(complex a){
20         return complex(r*a.r-i*a.i,i*a.r+r*a.i);
21     }
22 }A[maxn],B[maxn],C[maxn];
23
24 void Rader(complex *a,int len){
25     for(int i=1,j=len>>1;i<len-1;i++){
26         if(i<j)swap(a[i],a[j]);
27         int k=len>>1;
28         while(j>=k){
29             j-=k;
30             k>>=1;
31         }
32         j+=k;
33     }
34 }
35
36 void FFT(complex *a,int len,int on){
37     Rader(a,len);
38     for(int h=2;h<=len;h<<=1){
39         complex wn(cos(-on*2*PI/h),sin(-on*2*PI/h));
40         for(int j=0;j<len;j+=h){
41             complex w(1,0);
42             for(int k=j;k<j+(h>>1);k++){
43                 complex x=a[k];
44                 complex y=a[k+(h>>1)]*w;
45                 a[k]=x+y;
46                 a[k+(h>>1)]=x-y;
47                 w=w*wn;
48             }
49         }
50     }
51     if(on==-1)
52         for(int i=0;i<len;i++)
53             a[i].r/=1.0*len;
54 }
55
56 double f[maxn],E[maxn];
57 int main(){
58     int n,len=1;
59     scanf("%d",&n);
60     while(len<=n*2)len<<=1;
61     for(int i=1;i<=n;i++)
62         scanf("%lf",&f[i]);
63
64     for(int i=1;i<=n;i++){
65         A[i-1].r=f[i];
66         B[n-i].r=f[i];
67         C[i].r=1.0/i/i;
68     }
69     FFT(A,len,1);FFT(B,len,1);FFT(C,len,1);
70     for(int i=0;i<len;i++)
71         A[i]=A[i]*C[i],B[i]=B[i]*C[i];
72     FFT(A,len,-1);FFT(B,len,-1);
73     for(int i=0;i<n;i++){
74         E[i]=A[i].r-B[n-i-1].r;
75         printf("%.3f\n",E[i]);
76     }
77     return 0;
78 }
时间: 2024-10-09 16:57:15

数学(FFT):BZOJ 3527 [Zjoi2014]力的相关文章

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]力 [快速傅里叶变换]

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)

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

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<

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

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

【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

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 3257 ZJOI2014 力 快速傅里叶变换

题目大意:给定n个点,第i个点和第j个点之间的库仑力为(qi*qj)/(i-j)^2,定义左侧为正方向,求每个点受的合力与电荷量的比值 题解详见 http://eolv.farbox.com/post/shui-yu-zheng-feng/2014-12-07 我懒得打了- - #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algo