首页 > 代码库 > 3527: [Zjoi2014]力 - BZOJ
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 begin14 c.x:=a.x-b.x;15 c.y:=a.y-b.y;16 end;17 18 operator +(a,b:cp)c:cp;19 begin20 c.x:=a.x+b.x;21 c.y:=a.y+b.y;22 end;23 24 operator *(a,b:cp)c:cp;25 begin26 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 var32 i,p:longint;33 wt:cp;34 begin35 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 do38 begin39 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 do45 a[s+i<<t]:=tt[i];46 end;47 48 procedure main;49 var50 i:longint;51 begin52 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 begin68 main;69 end.
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。