bzoj3527: [Zjoi2014]力

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 using namespace std;
 7 const int maxn=400005;
 8 const double PI=acos(-1);
 9 struct node{
10     double real,imag;
11     void clear(){real=imag=0;}
12     node operator +(const node &x){return (node){real+x.real,imag+x.imag};}
13     node operator -(const node &x){return (node){real-x.real,imag-x.imag};}
14     node operator *(const node &x){return (node){real*x.real-imag*x.imag,real*x.imag+imag*x.real};}
15 }q[maxn],p[maxn],A[maxn],t1,t2,w,wn;
16 int m,n,len,rev[maxn];
17 int Rev(int x){
18     int temp=0;
19     for (int i=1;i<=len;i++){temp<<=1,temp+=(x&1),x>>=1;}
20     return temp;
21 }
22 void FFT(node *a,int op){
23     for (int i=0;i<n;i++) if (i<rev[i]) swap(a[i],a[rev[i]]);
24     for (int s=2;s<=n;s<<=1){
25         wn=(node){cos(2.0*op*PI/s),sin(2.0*op*PI/s)};
26         for (int i=0;i<n;i+=s){
27             w=(node){1,0};
28             for (int j=i;j<i+s/2;j++,w=w*wn){
29                 t1=a[j],t2=w*a[j+s/2];
30                 a[j]=t1+t2,a[j+s/2]=t1-t2;
31             }
32         }
33     }
34 }
35 int main(){
36     scanf("%d",&m); n=1,len=0;
37     while (n<(m<<1)) n<<=1,len++;
38     for (int i=0;i<n;i++) rev[i]=Rev(i);
39     for (int i=0;i<n;i++) p[i].clear(),q[i].clear();
40     for (int i=1;i<=m;i++) scanf("%lf",&q[i].real);
41     for (int i=0;i<m;i++) p[i].real=-1.0/(i-m)/(i-m);
42     p[m].real=0; for (int i=m+1;i<n;i++) p[i].real=1.0/(i-m)/(i-m);
43     FFT(q,1),FFT(p,1);
44     for (int i=0;i<n;i++) A[i]=q[i]*p[i];
45     FFT(A,-1);
46     for (int i=0;i<n;i++) A[i].real=1.0*A[i].real/n;
47     for (int i=1;i<=m;i++) printf("%.3lf\n",A[m+i].real);
48     return 0;
49 }
50 

题目大意;题意上网找吧。

做法:我们令A[i+n]=E[n],然后修改一个数组的定义,就是裸的卷积了,直接FFT,详见16年国家集训队论文。

时间: 2024-08-06 11:55:55

bzoj3527: [Zjoi2014]力的相关文章

BZOJ3527 [Zjoi2014]力 【fft】

题目 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. 输入格式 第一行一个整数n. 接下来n行每行输入一个数,第i行表示qi. 输出格式 n行,第i行输出Ei.与标准答案误差不超过1e-2即可. 输入样例 5 4006373.885184 15375036.435759 1717456.469144 8514941.004912 1410681.345880 输出样例 -16838672.693 3439.793 7509018.566 4595686.886 1090304

bzoj3527: [Zjoi2014]力 卷积+FFT

先写个简要题解:本来去桂林前就想速成一下FFT的,结果一直没有速成成功,然后这几天断断续续看了下,感觉可以写一个简单一点的题了,于是就拿这个题来写,之前式子看着别人的题解都不太推的对,然后早上6点多推了一个多小时终于发现了一个很巧妙的方法,首先问题的关键在于后半个式子,因为显然前半个式子很容易想到卷积的形式,那么直接FFT就好了,但是后半部分不好考虑,一般肯定是通过类似换元的做法得出结论,所以到中间有一步就有点难度,那个地方我一直卡.后来突然想到,既然前半部分i<j时那么好处理,那么i>j的情

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】力 FFT

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

[Zjoi2014]力 FFT

#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> using namespace std; typedef double dd; const dd pi=acos(0.0)*2; #define N 400005 struct P{ dd x,y; P(dd A=0.0,dd B=0.0){ x=A; y=B; } P

【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

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

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)

BZOJ[3527],[ZJOI2014]力(FFT) 题意: 给出\(n\)个数\(q_i\),给出\(Fj\)的定义如下: \(F_j=\sum \limits _ {i < j} \frac{q_iq_j}{(i-j)^2}-\sum \limits _{i >j} \frac{q_iq_j}{(i-j)^2}.\) 令\(E_i=F_i/q_i\),求\(E_i\). 题解: 一开始没发现求\(E_i\)... 其实题目还更容易想了... \(E_i=\sum\limits _{j&l