FFT優化 UOJ 34 多項式乘法

2022-05-20 07:57:48 字數 3842 閱讀 7801

這是一道模板題。

給你兩個多項式,請輸出乘起來後的多項式。

第一行兩個整數

n 和

m,分別表示兩個多項式的次數。

第二行 n+

1 個整數,分別表示第乙個多項式的

0 到

n 次項前的係數。

第三行 m+

1 個整數,分別表示第乙個多項式的

0 到

m 次項前的係數。

一行 n+m

+1個整數,分別表示乘起來後的多項式的

0 到 n+

m 次項前的係數。

input

1 2

1 21 2 1

output
1 4 5 2
explanation(1

+2x)

⋅(1+

2x+x

2)=1

+4x+

5x2+

2x3。

0≤n,

m≤105

,保證輸入中的係數大於等於

0 且小於等於 9。

時間限制:1s

空間限制

256mb

本部落格主要用於存ff

t優化模板.

對於兩個實係數的多項式a(

x),b

(x),長度均為n(

n為2的整次數冪),令 p(

x)=a

(x)+

ib(x

)q(x

)=a(

x)−i

b(x)

fp[k

],fq

[k]為

p(x)

,q(x

)進行df

t後的值. 令x

=2πj

kn f

p[k]

=a(ω

kn)+

ib(ω

kn)=

∑j=0

n−1a

jωjk

n+i∑

j=0n

−1bj

ωjkn

=∑j=

0n−1

(aj+

ibj)

∗(cos(x)

+isin(x)

)fq[

k]=a

(ωkn

)−ib

(ωkn

)=∑j

=0n−

1ajω

jkn−

i∑j=

0n−1

bjωj

kn=∑

j=0n

−1(a

j−ib

j)∗(

cos(x)

+isin(x)

)=∑j

=0n−

1aj∗

cos(x)

+iaj

sin(x)

−ibj

cos(x)

+bjsin(x

)=∑j

=0n−

1(aj

cos(x)

+bjsin(x

))+i

(ajsin(x

)−bj

cos(x)

)=∑j

=0n−

1con

j((a

jcos(x

)+bj

sin(x)

)−i(

ajsin(x)

−bjcos(x

)))=

∑j=0

n−1c

onj(

(ajcos(−

x)−b

jsin(−

x))+

i(aj

sin(−x

)+bj

cos(−x

)))=

∑j=0

n−1c

onj(

aj(cos(−

x)+i

sin(−x

))+i

bj(cos(−

x)+i

sin(−x

)))=

∑j=0

n−1c

onj(

(aj+

ibj)

∗(cos(−x

)+isin(−

x))=

∑j=0

n−1c

onj(

ajω−

jkn+

ibj(

ω−jk

n))=

conj

(a(ω

−kn)

+ib(

ω−kn

))=c

onj(

a(ωn

−kn)

+ib(

(ωn−

kn))

=con

j(fp

[n−k

])這樣我們就可以通過一次dft求出fp

,fq

dft(

a[k]

)=fp

[k]+

fq[k

]2df

t(b[

k])=

fp[k

]−fq

[k]2

i=−i

fp[k

]−fq

[k]2

如果只是做多項式乘法c(

x)=a

(x)∗

b(x)

,直接使n變為

a,b長度的和,然後df

t(c[

k])=

(fp[

k]2−

fq[k

]2)∗

−i4=

(fp[

k]2−

fp[n

−k]2

)∗−i

4

#include

#include

#include

#include

#define maxn 300000

using

namespace

std;

const

double pi=acos(-1);

int n,m,n,ans[maxn+10];

char s[maxn+10];

struct cpx

inline cpx(double r,double i):r(r),i(i)

inline cpx operator+(const cpx &b)const

inline cpx operator-(const cpx &b)const

inline cpx operator*(const cpx &b)const

inline cpx &operator*=(const cpx &b)

inline cpx conj()const

}a[maxn+10],b[maxn+10],t[maxn+10];

void fft(cpx *a,int n,int f)

fft(c,n,-1);

// c refer t

//a[i]=(c[i]+c[k-i])/2

//b[i]=-i(c[i]-c[k-i])/2

//a[i]*b[i]=(c[i]*c[i]-c[k-i]*c[k-i])*((-i)/4)

}void read()

void print()

for(i=n-1;i;i--)

if(ans[i])

break;

for(;i>=0;i--)

printf("%d",ans[i]);

puts("");

}int main()

UOJ 34 多項式乘法(FFT)

description 給你兩個多項式,請輸出乘起來後的多項式 input 第一行兩個整數 n 和 m,分別表示兩個多項式的次數 第二行n 1 個整數,分別表示第乙個多項式的 0 到 n次項前的係數 第三行m 1 個整數,分別表示第乙個多項式的 0 到 m次項前的係數 output一行n m 1 個...

UOJ 34 多項式乘法

快速傅利葉變換 關於fft網上的教材不多,而且大多與演算法問題關係不大。強烈推薦乙個。這個講得真的很不錯 從多項式乘法到快速傅利葉變換 本弱數學知識不夠多,複數 單位根之類的知識都是下午臨時補的。從下午開始看fft,看到晚上,總算大概是把遞迴版fft的思路看懂了吧。迭代版的還沒看懂。有空慢慢鑽研 u...

UOJ 34 多項式乘法

統計這是一道模板題。給你兩個多項式,請輸出乘起來後的多項式。第一行兩個整數 n n 和 mm 分別表示兩個多項式的次數。第二行 n 1 n 1 個整數,分別表示第乙個多項式的 0 0 到 nn 次項前的係數。第三行 m 1 m 1 個整數,分別表示第乙個多項式的 0 0 到 mm 次項前的係數。一行...