日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P3338-[ZJOI2014]力【FFT】

發布時間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P3338-[ZJOI2014]力【FFT】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/P3338


題目大意

Fj=∑i=1j?1qi?qj(i?j)2?∑i=j+1nqi?qj(i?j)2F_j=\sum_{i=1}^{j-1}\frac{q_i*q_j}{(i-j)^2}-\sum_{i=j+1}^n\frac{q_i*q_j}{(i-j)^2}Fj?=i=1j?1?(i?j)2qi??qj???i=j+1n?(i?j)2qi??qj??
Ej=FjqjE_j=\frac{F_j}{q_j}Ej?=qj?Fj??


解題思路

顯然有Fj=∑i=1j?1qi(i?j)2?∑i=j+1nqi(i?j)2F_j=\sum_{i=1}^{j-1}\frac{q_i}{(i-j)^2}-\sum_{i=j+1}^n\frac{q_i}{(i-j)^2}Fj?=i=1j?1?(i?j)2qi???i=j+1n?(i?j)2qi??
然后定義ai=qi,bi=1i2a_i=q_i,b_i=\frac{1}{i^2}ai?=qi?,bi?=i21?,那么有
Fj=∑i=1j?1ai?bj?i?∑i=j+1nai?bi?jF_j=\sum_{i=1}^{j-1}a_i*b_{j-i}-\sum_{i=j+1}^{n}a_i*b_{i-j}Fj?=i=1j?1?ai??bj?i??i=j+1n?ai??bi?j?
前面那個式子顯然可以卷積,然后后面那個式子把aaa數組翻轉之后就和前面那個一樣了。

然后FFTFFTFFT優化即可,時間復雜度O(nlog?n)O(n\log n)O(nlogn)

才發現有complexcomplexcomplex這個庫,終于不用手寫復數運算了(不知道比賽能不能用)


codecodecode

#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<complex> #define Pi acos(-1) using namespace std; typedef complex<double> comp; const int N=3e5+10; /*struct comp{double x,y; }; complex operator +(complex a,complex b) {return (complex){a.x+b.x,a.y+b.y};} complex operator -(complex a,complex b) {return (complex){a.x-b.x,a.y-b.y};} complex operator *(complex a,complex b) {return (complex){a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};}*/ int n,r[N],z; comp a1[N],a2[N],b1[N],b2[N]; void fft(comp *f,int op){for(int i=0;i<n;i++)if(i<r[i])swap(f[i],f[r[i]]);for(int p=2;p<=n;p<<=1){int len=p>>1;comp tmp(cos(Pi/len),sin(Pi/len)*op); // printf("%lf ",tmp.real()); for(int k=0;k<n;k+=p){comp buf(1,0);for(int i=k;i<k+len;i++){comp tt=buf*f[len+i];f[len+i]=f[i]-tt;f[i]=f[i]+tt;buf=buf*tmp;}}}if(op==-1)for(int i=0;i<n;i++)f[i]/=n;return; } int main() {scanf("%d",&n);int l;z=n;for(int i=1;i<=n;i++){double x;scanf("%lf",&x);a1[i]=a2[n-i+1]=x;b1[i]=b2[i]=(double)1.0/i/i;}for(l=1;l<=n*2;l<<=1);n=l;for(int i=0;i<n;i++)r[i]=(r[i>>1]>>1)|((i&1)?n>>1:0);fft(a1,1);fft(b1,1);for(int i=0;i<n;i++)a1[i]=a1[i]*b1[i];fft(a1,-1);fft(a2,1);fft(b2,1);for(int i=0;i<n;i++)a2[i]=a2[i]*b2[i];fft(a2,-1);for(int i=1;i<=z;i++)printf("%.3lf\n",a1[i].real()-a2[z-i+1].real());return 0; }

總結

以上是生活随笔為你收集整理的P3338-[ZJOI2014]力【FFT】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。