P4239 任意模數多項式乘法逆

2021-10-03 11:47:21 字數 4127 閱讀 5050

就是:

多項式求逆加任意模數ntt。

通常處理任意模數ntt有兩種方式,這裡選擇其中一種。

吸氧過的。

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define llu unsigned ll

using

namespace std;

const

int mod=

1e9+7;

const

int p=mod;

const

int pm=

32768

;const

int maxn=

4e5+

100;

const

double pi=

acos(-

1.0)

;struct complex

complex operator-(

const complex &b)

const

complex operator+(

const complex &b)

const

complex operator*(

const complex &b)

const};

int fi[maxn]

,ans1[maxn]

,ans2[maxn]

;int n;

complex a1[maxn]

,b1[maxn]

,a2[maxn]

,b2[maxn]

,ww[maxn]

,ta[maxn]

;int b[maxn]

,invb[maxn]

;void

fft(complex *x,

int len,

int f)}}

if(f==-1

)for

(int i=

0;i) x[i]

.x/=len;

}void

get(complex *x,complex *y,

int len,

int pm,

int*ans)

void

mtt(

int*a,

int*b,

int n,

int*ans)

for(

int i=

0;i)fft

(a1,len,1)

;fft

(b1,len,1)

;fft

(a2,len,1)

;fft

(b2,len,1)

;get

(a1,a2,len,pm*pm%p,ans)

;get

(a1,b2,len,pm%p,ans)

;get

(a2,b1,len,pm%p,ans)

;get

(b1,b2,len,

1,ans);}

intmypow

(int a,

int b)

return ans;

}void

inv(

int n,

int*a,

int*b)

inv(

(n+1

)>>

1,a,b)

;mtt

(a,b,n,ans1)

;mtt

(ans1,b,n,ans2)

;for

(int i=

0;i) b[i]=(

2ll*b[i]

-ans2[i]

+mod)

%mod;

}int

main

(void

)

終於解決了乙個困惑我的問題。

見注釋。

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define llu unsigned ll

using

namespace std;

const

int mod=

1e9+7;

const

int p=mod;

const

int pm=

32768

;const

int maxn=

4e5+

100;

const

double pi=

acos(-

1.0)

;struct complex

complex operator-(

const complex &b)

const

complex operator+(

const complex &b)

const

complex operator*(

const complex &b)

const};

int fi[maxn]

,ans1[maxn]

,ans2[maxn]

;int n;

complex a1[maxn]

,b1[maxn]

,a2[maxn]

,b2[maxn]

,ww[maxn]

,ta[maxn]

;int b[maxn]

,invb[maxn]

;void

fft(complex *x,

int len,

int f)}}

if(f==-1

)for

(int i=

0;i) x[i]

.x/=len;

}void

get(complex *x,complex *y,

int len,

int pm,

int*ans)

void

mtt(

int*a,

int*b,

int n,

int*ans)

for(

int i=

0;i)fft

(a1,len,1)

;fft

(b1,len,1)

;fft

(a2,len,1)

;fft

(b2,len,1)

;get

(a1,a2,len,pm*pm%p,ans)

;get

(a1,b2,len,pm%p,ans)

;get

(a2,b1,len,pm%p,ans)

;get

(b1,b2,len,

1,ans);}

intmypow

(int a,

int b)

return ans;

}void

inv(

int n,

int*a,

int*b)

inv(

(n+1

)>>

1,a,b)

;mtt

(a,b,n,ans1)

;//這裡應該這樣寫,注意觀察原式

//注意比較與對998244353取模時,用ntt做法的不同。

for(

int i=

0;i) ans1[i]

=p-ans1[i]

; ans1[0]

=(ans1[0]

+2)%p;

mtt(ans1,b,n,ans2)

;for

(int i=

0;i) b[i]

=ans2[i];}

intmain

(void

)

任意模數多項式乘法逆

蒟蒻 thesure 剛剛打了任意模數多項式乘法逆的板子 然後 lin4xu 扔來乙個多項式 f x 並 讓 thesure 求出它乘法逆的 x n 項係數對mod取模的結果 lin4xu 知道 thesure 很菜,所以並不想難為 thesure 1.多項式的最高次數不會超過 10 2.f 0 1...

任意模數多項式乘法

多項式乘法 給定乙個 n 次多項式 f x 和乙個 m 次多項式,求出 f x times g x 係數對 p 取模,且不保證 p 可以分解成 p 2 ka 1 之形式,0 leq a i,b i leq 10 9 2 leq p leq 10 9 9 考慮直接用 fft 但是值域太大,long d...

P4245 模板 任意模數多項式乘法

首先這類問題指的是對於乙個非ntt模數,我們如何計算多項式乘法,對於ntt不容易找到單位根,對於fft又會爆精度。方法1 三模數ntt 尋找三個大模數最後crt合併即可 方法2 mtt 將係數拆分為兩部分,分別是m的倍數和餘數,然後我們只需要對其分別處理即可,但是這樣暴力的做一共需要7次fft複雜度...