這題是我搜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...