學習筆記 多項式 ln exp

2022-04-07 09:26:58 字數 3118 閱讀 1765

\[\begin

(\ln x)' &= \frac \\

(\exp x)' &= x \\

\end

\]復合函式的求導(鏈式法則)

\[(g\circ f)' (x) = g(f(x))'f'(x)

\]多項式求逆,分治fft。

設 \(g(x) = \ln\),則有

\[\begin

g'(x) = f'(x) \frac

\end

\]先把 \(g'(x)\) 求出來然後再積分就行了。

多項式求導,積分都是 \(o(n)\) 的,多項式乘法為 \(o(n\log n)\),所以總複雜度為 \(o(n\log n)\)。

設 \(g(x) = e^\),則有

\[\begin

g'(x) = g(x)f'(x)

\end

\]寫成卷積的形式就是(\(f_i\) 表示 \(f(x)\) 的 \(i\) 次項次數)

\[g'_i = \sum_^i g_j f_

\]然後因為 \(f'_i = (i + 1)f_\),所以就有

\[\begin

g_ &= \frac \sum_^i g_ (i + 1 - j) f_ \\

g_i &= \frac \sum_^ g_ (i - j) f_

\end

\]可以用分治 fft 解決,時間複雜度為 \(o(n \log^2 n)\)。

[學習筆記]牛頓迭代

時間複雜度為 \(o(n \log n)\) ,但由於實現過程中需要求 \(\ln\),所以實際上快不了多少(至少在洛谷的模板上跑得差不多)。

#include #include using namespace std;

typedef long long ll;

const int _ = (1 << 18) + 7;

const int mod = 998244353;

const int rt = 3;

int n,f[_];

int pw(int a,int p)

return res;

}namespace poly

} void ntt(int *f,int t,bool ty)

for (int len = 2; len <= t; len <<= 1) }}

if (ty) for (int i = 0; i < t; ++i) f[i] = (ll)f[i] * inv[t] % mod;

} void mul(int *f,int *g,int *h)

void inv(int *f,int *h)

} void deriv(int *f,int *h)

void integ(int *f,int *h)

void ln(int *f,int *h)

}int gi()

int main()

#include #include #include using namespace std;

typedef long long ll;

const int _ = (1 << 18) + 7;

const int mod = 998244353,rt = 3;

int n,g[_],f[_];

int pw(int a,int p)

return res;

}namespace poly

} void ntt(int *f,int t,bool ty)

for (int len = 2; len <= t; len <<= 1)

}if (ty) for (int i = 0; i < t; ++i) f[i] = (ll)f[i] * inv[t] % mod;

} void mul(int *f,int *g,int *h,int t)

void dcntt(int *f,int *g,int t,int l,int r)

dcntt(f,g,t >> 1,l,(l + r) >> 1);

memset(tmp[0] + (t >> 1),0,t << 1);

memcpy(tmp[0],f,t << 1);

mul(tmp[0],g,tmp[0],t);

for (int i = (t >> 1); i < t; ++i) f[i] = (f[i] + tmp[0][i - 1]) % mod;

dcntt(f + (t >> 1),g,t >> 1,(l + r) >> 1,r);

} void exp(int *f,int *g)

void deriv(int *f,int *h)

}int main()

#include #include #include using namespace std;

typedef long long ll;

const int _ = (1 << 18) + 7;

const int mod = 998244353,rt = 3;

int n,f[_],g[_];

int pw(int a,int p)

return res;

}namespace poly

} void clear(int *f,int l)

void ntt(int *f,int l,bool ty)

for (int len = 2; len <= l; len <<= 1)

}if (ty) for (int i = 0; i < l; ++i) f[i] = (ll)f[i] * inv[l] % mod;

} void cpy(int *h,int *f,int l)

void inv(int *h,int *f,int l)

} void deriv(int *h,int *f,int l)

void integ(int *h,int *f,int l)

void ln(int *h,int *f,int l)

void exp(int *h,int *f,int l)

}}int main()

學習筆記 多項式

給你n個點 x 1,y 1 x 2,y 2 求乙個n 1次的多項式 f x 求 f k 我們可以認為 f x f 1 x f 2 x f x 其中 f i x i y i 且 forall j neq i,f i x j 0 也就是說乙個點 x i 只在乙個函式中為 y i 其他函式中均為0 換言之...

學習筆記 多項式

把一直學不懂的各種大常數 o n log n 的神奇多項式演算法總結一下 證明什麼的比較簡略 還有我今天才知道預處理一下單位根會快很多 qwq 最沒用的乙個 首先我們能寫出乙個 o n 2 的暴力 這個你都不會就可以退役了 某位dalao題解中的 要確定乙個多項式,我們發現只要代 f 1 f 2 f...

多項式學習筆記

太菜了並不是很理解多項式,簡單記錄一下,緩慢更新吧 有問題問快速航 首先我們要求的柿子長這樣 c k sum a i b j 大概思路 先把兩個多項式轉成點值 dft 再把兩個多項式的點值乘在一起,把新的點值轉成多項式 idft 即可 首先要了解複數的運算 a b i c d i a c b d i...