給出n個數qi,給出fj的定義如下: fj
=∑ii⋅qj
(i−j
)2−∑
i>jq
i⋅qj
(i−j
)2令ei=fi/qi,求ei.
第一行乙個整數n。
接下來n行每行輸入乙個數,第i行表示qi。
n≤100000,0 < qi < 1000000000
n行,第i行輸出ei。與標準答案誤差不超過1e-2即可。
5 4006373.885184
15375036.435759
1717456.469144
8514941.004912
1410681.345880
-16838672.693
3439.793
7509018.566
4595686.886
10903040.872
閱讀題目,發現題目中給出的ei=fi/qi的條件可以化簡,即: ej
=∑ii(i−
j)2−
∑i>jq
i(i−
j)2
這個式子很容易讓我們將它與卷積聯絡起來,我們可以嘗試構造兩組多項式,使其乘積後係數中包含ei,於是: a(
x)=q
0⋅x0
+q1⋅
x1+q
2⋅x2
+⋯+q
n−1⋅
xn−1
+0⋅x
n+0⋅
xn+1
+…0⋅
x2∗n
−3 b
(x)=
−1(n
−1)2
⋅x0+
−1(n
−2)2
⋅x1+
⋯+−1
(−1)
2⋅xn
−1+0
⋅xn+
112⋅
xn+1
+⋯+1
(n−2
)2⋅x
2∗n−
3+1(
n−1)
2⋅x2
∗n−2
這樣令c(x)=a(x)
× b(x),c(x)的第n-1~2*n-2項的係數即為所求!
如果有讀者不清楚fft或者卷積的,可以參考我的部落格:快速傅利葉變換(fft)
#include
#define pi acos(-1.0)
#define maxn 500010
//#define debug
using
namespace
std;
int n,m,l=0;
int rev[maxn];
struct complex
complex(double real,double imag):real(real),imag(imag) {}
complex operator + (const complex rhs)
complex operator - (const complex rhs)
complex operator * (const complex rhs)
};complex a[maxn],b[maxn];
void pre()
void fft(complex a,int n,int flag)}}
if(flag==-1)
for(int i=0;iint main()
for(int i=0;i1;++i) b[i].real=-1.0/(n-i-1)/(n-i-1);
for(int i=n;i<2*n-1;++i) b[i].real=1.0/(i-n+1)/(i-n+1);
#ifdef debug
for(int i=0;i<2*n-1;++i) printf("%.4lf ",b[i].real);
#endif
pre();
fft(a,n,1);
fft(b,n,1);
for(int i=0;i<=n;++i) a[i]=a[i]*b[i];
fft(a,n,-1);
for(int i=m/2-1;i1;++i) printf("%lf\n",a[i].real);
return
0;}
bzoj 2194 快速傅利葉變換
請計算c k sigma a i b i k 其中 k i n 並且有 n 10 5。a,b中的元素均為小於等於100的非負整數。第一行乙個整數n,接下來n行,第i 2.i n 1行,每行兩個數,依次表示a i b i 0 i n 輸出n行,每行乙個整數,第i行輸出c i 1 5 3 1 2 4 1...
傅利葉變換與快速傅利葉變換
作為電子資訊專業的學生老說,這個不知道,或者理解不清楚,是十分不應該的,作為乙個學渣,有時候確實是理解不清楚的 1 首先離散傅利葉變換目的 簡單點說 就是將乙個訊號從時域變換到頻域 標準點說 將以時間為自變數的訊號 與 頻率為自變數的頻譜函式之間的某種關係變換 數學描述 對於 n點序列 其中自然對數...
快速傅利葉變換
學習快速傅利葉變化是量子計算中的基礎,查了很多資料,以下鏈結可以作為參考 本部落格部分知識學習於 最後這個裡面有解釋蝴蝶效應是怎麼來的!實用數字訊號處理 dft 離散傅利葉變換 o n2 計算多項式乘法 fft 快速傅利葉變換 o n log n 計算多項式乘法 fntt ntt 快速傅利葉變換的優...