bzoj3625 NTT 多項式求逆 多項式開根)

2021-08-07 16:48:39 字數 2371 閱讀 9793

這題是我搜ntt搜到的,當時就看到「多項式開根」這樣的標題,於是找到了l-leader的部落格,補了下冪級數的東西,用兩節數學課學會了。題面

我再看題解,好像都是教我怎麼開方,求逆的,然後又拖了幾天。終於昨晚睡不著,突然就想到了。。。

先介紹一下生成函式。

簡單的說,就是乙個陣列a[0..n],可以生成乙個多項式函式(冪級數)f(

x)=∑

i=0n

a[i]

∗xi

題意是給你二叉樹每個節點可能的點權集合c,元素都<=1e5,對於所有1<=s<=m,有種不同的二叉樹滿足點權和為s,答案模乙個費馬素數。

設g[i]為乙個01陣列,表示i是否在c出現,f[i]為權值和為i的方案數,即是答案。f為f的生成函式,g為g的生成函式,根據題意g[0]=0,因為存在空樹,f[0]=1;

我們可以列舉二叉樹根的權值,剩下左右兒子為子問題,就有f[

x]=∑

i=0x

g[i]

∑j=0

x−if

[j]∗

f[x−

i−j]

就可以大概知道f=

f2g 。

根據f[0]=1,g[1]=0,所以有f=

f2g+

1 通過解一元二次方程,再結合f[0]=1,g[1]=0 f=

21+1

−4g−

−−−−

−√然後就是多項式求逆和多項式開根了。

#include 

#include

#include

#include

#include

#include

#include

#include

using namespace std;

#define mmst(a, b) memset(a, b, sizeof(a))

#define mmcp(a, b) memcpy(a, b, sizeof(b))

typedef long long ll;

const int p=998244353,i2=499122177;

const int n=800400;

int cheng(int a,int b)

int n,rev[n];

void init(int lim)} }

if(!ops)

}int g[n];

int mx=1,by,nn,mm;

int x[n],y[n],s

qr[n],a[n],b[n],c[n];

void inverse(int

*a,int

*b,ll len)

inverse(a,b,len>>1);

init(2

*len);

for(int i=0;ifor(int i=0;i<(len>>1);i++)

y[i]=b[i];

ntt(x,1);

ntt(y,1);

for(int i=0;i2ll*y[i]%p-(ll)x[i]*y[i]%p

*y[i]%p+p)%p;

ntt(x,0);

for(int i=0;iif(i>=len)

b[i]=0;

else

b[i]=x[i];

x[i]=y[i]=0;

}}void sqrt(int len)

sqrt(len>>1);

inverse(sqr,a,len);

for(int i=0;i<(len>>1);i++)

b[i]=s

qr[i];

for(int i=0;i*2);

ntt(a,1);

ntt(b,1);

ntt(c,1);

for(int i=0;i1ll*c[i]+(ll)b[i]*b[i])%p

*i2%p

*a[i]%p;

ntt(a,0);

for(int i=0;is

qr[i]=a[i];

if(i>=len)

sqr[i]=0;

a[i]=b[i]=c[i]=0;

}}int main()

for(int i=0;iif(g[i])

g[i]=p-4;

g[0]=1;

sqrt(mx);

sqr[0]=(s

qr[0]+1)%p;

mmst(g,0);

inverse(sqr,g,mx);

for(int i=1;i<=mm;i++)

printf("%d\n",(g[i]+g[i])%p);

return

0;}

BZOJ3456 城市規劃(多項式求逆 NTT)

點此看題面 大致題意 求出 n 個點的簡單 無重邊無自環 有標號無向連通圖數目。在我的想象裡,這道題應該是無比冗長 十分複雜 令人懵逼的題面 極其恐怖 難以理解 又臭又長的式子 分治 ntt 多項式求逆 多項式對數 指數型生成函式 一堆五花八門 亂七八糟的東西。然而真正點開這道題,題面簡潔明瞭 就一...

JZYZOJ 2042 多項式逆元 NTT 多項式

題意 求乙個次數界為n的多項式在模p並模x m的意義下的逆元。p 7 17 2 23 1。多項式逆元的含義以及求逆元的方法 公式推導一下。主要還是ntt的使用,我ntt寫錯了調了半天,太zz了。1 include2 include3 include4 include5 include6 includ...

數學 多項式 多項式求逆

多項式求逆 前置知識 ntt 給定乙個多項式 f left x right 求乙個多項式 g left x right 使得 f left x right g left x right equiv 1 left bmod 998244353 right 考慮遞迴求解。假定現在已經求出了 g 0 le...