码迷,mamicode.com
首页 > 其他好文 > 详细

3527 Zjoi2014 力

时间:2017-11-26 13:55:16      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:技术分享   upload   pac   div   clu   oid   har   namespace   sed   

3527: [Zjoi2014]力

Time Limit: 30 Sec  Memory Limit: 256 MBSec  Special Judge
Submit: 2417  Solved: 1435
[Submit][Status][Discuss]

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.345880

Sample Output

-16838672.693
3439.793
7509018.566
4595686.886
10903040.872

HINT

Source

仔细观察这个式子 前半部分的Ei很符合卷积的性质,但是后半部分看的十分不友善

我们用f1[i]表示q[i],f2[i]表示q[n-i-1],a[i]表示(1.0/i/i);

那么E[i]前半部分=sigma qj/(j-i)^2可以看做f1[i]*a[j-i],一个赤裸裸的卷积

后半部分可以表示为f2[n-i-1]*a[j-i],只好像不像卷积啊,我们把f2[i]数组给反过来,这样和不就是一个定值了么

技术分享图片
 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 const double pi=acos(-1);
 5 inline int read(){
 6     int x=0;int f=1;char ch=getchar();
 7     while(!isdigit(ch)) {if(ch==-) f=-1;ch=getchar();}
 8     while(isdigit(ch)) {x=x*10+ch-0;ch=getchar();}
 9     return x*f;
10 }
11 const int MAXN=1e6+10;
12 typedef complex <double> E;
13 E a[MAXN],f1[MAXN],f2[MAXN],w[MAXN];
14 int L,H,R[MAXN];
15 inline void FFT(E *a,int f){
16     for(int i=0;i<L;i++){
17         if(i<R[i]) swap(a[i],a[R[i]]);
18     }
19     for(int len=2;len<=L;len<<=1){
20         int l=len>>1;
21         E wn(cos(pi/l),f*sin(pi/l));
22         for(int i=1;i<l;i++) w[i]=w[i-1]*wn;
23         for(int st=0;st<L;st+=len){
24             for(int k=0;k<l;k++){
25                 E x=a[st+k];E y=w[k]*a[st+l+k];
26                 a[st+k]=x+y;a[st+k+l]=x-y;
27             }
28         }
29     }
30     if(f==-1){
31         for(int i=0;i<L;i++){
32             a[i]/=L;
33         }
34     }
35 }
36 int main(){
37     int n=read();w[0].real()=1;
38     for(int i=0;i<n;i++){
39         scanf("%lf",&f1[i].real());
40         f2[n-i-1]=f1[i];
41     }
42     for(int i=1;i<=n;i++){
43         a[i]=(1.0/i/i);
44     }
45     L=1;
46     while(L<=n+n) L<<=1,H++;
47     for(int i=0;i<L;i++){
48         R[i]=(R[i>>1]>>1)|((i&1)<<(H-1));
49     }
50     FFT(f1,1);FFT(a,1);FFT(f2,1);
51     for(int i=0;i<L;i++){
52         f1[i]=f1[i]*a[i];
53         f2[i]=f2[i]*a[i];
54     }
55     FFT(f1,-1);FFT(f2,-1);
56     for(int i=0;i<n;i++){
57         printf("%.3lf\n",f1[i].real()-f2[n-i-1].real());
58     }
59     return 0;
60 }
View Code

 

3527 Zjoi2014 力

标签:技术分享   upload   pac   div   clu   oid   har   namespace   sed   

原文地址:http://www.cnblogs.com/something-for-nothing/p/7898684.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!