UOJ 34 多項式乘法(FFT)

2021-08-06 07:41:55 字數 2073 閱讀 1560

description

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

input

第一行兩個整數

n 和

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

第二行n+1

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

0 到

n次項前的係數

第三行m+1

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

0 到

m次項前的係數

output一行n

+m+1

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

0 到n+

m次項前的係數

sample input

1 2

1 2

1 2 1

sample output

1 4 5 2

solutionf

ft模版題

code

#include

#include

#include

using

namespace

std;

namespace fastio

}return *p1++;

}inline

bool blank(char ch)

inline

void read(int &x)

inline

void readc(char &x)

#undef buf_size

};using

namespace fastio;

#define maxn 131072+5

const

double pi=acos(-1.0);

struct cp

;} cp operator -(const cp &o)const ;}

cp operator *(const cp &o)const ;}

cp operator *(const

double &o)const ;}

cp operator !() const;}

}w[maxn];

int pos[maxn];

void fft_init(int len)

; for(unsigned i=2;i<=len;i<<=1)

;for(int j=i>>1;j>=0;j-=2)w[j]=w[j>>1];

for(int j=1;j>1;j+=2)w[j]=w[j-1]*g;

for(int j=0;j>1);

for(int l=0;l>1;l++)}}

if(sta==-1)for(int i=0;ivoid fft(int *a,int *b,int n,int m,int *c)

for(int i=0;i1?x[i>>1].b:x[i>>1].a)=a[i];

for(int i=0;i1?y[i>>1].b:y[i>>1].a)=b[i];

int len=1;

while(len<(n+m)>>1)len<<=1;

fft_init(len);

fft(x,len,1),fft(y,len,1);

for(int i=0;i2;i++)

)*0.25;

}for(int i=len/2;iint j=len-1&len-i;

z[i]=x[i]*y[i]-(x[i]-!x[j])*(y[i]-!y[j])*((cp)-w[i^len>>1])*0.25;

}fft(z,len,-1);

for(int i=0;iif(i&1)c[i]=(int)(z[i>>1].b+0.5);

else c[i]=(int)(z[i>>1].a+0.5);

}int n,m,a[maxn],b[maxn],c[maxn<<1];

int main()

FFT優化 UOJ 34 多項式乘法

這是一道模板題。給你兩個多項式,請輸出乘起來後的多項式。第一行兩個整數 n 和 m,分別表示兩個多項式的次數。第二行 n 1 個整數,分別表示第乙個多項式的 0 到 n 次項前的係數。第三行 m 1 個整數,分別表示第乙個多項式的 0 到 m 次項前的係數。一行 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 次項前的係數。一行...