\[\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...