就是:
多項式求逆加任意模數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複雜度...