Luogu P5264 多项式三角函数
\(\mathtt{Description}\)
给定 \(\deg = n\) 的多项式 \(f\) 和 \(\text{type}\),求一个多项式 \(g\) 使得
\[g\equiv \sin f \pmod {998244353}\quad(\text{type}=0)
\]
\[g\equiv \cos f \pmod {998244353}\quad(\text{type}=1)
\]
\(\mathtt{restrictions:}1\leq n \le10^5,a_i\in[0,998244353)\cap \mathbb{N}\)
\(\mathtt{Solution}\)
奇怪的多项式模板增加了!
\(\mathtt{Pre\;Knowledge}\)
- 多项式 \(\exp\)
- 欧拉公式
\(\mathtt{Main\;Body}\)
我们知道欧拉公式
\[e^{ix} = \cos x+ i\sin x
\]
有
\[e^{-ix} = \cos x -i\sin x
\]
故
\[\cos x=\dfrac {e^{ix}+e^{-ix}} {2}
\]
\[\sin x = \dfrac{e^{ix}-e^{-ix}}{2i}
\]
又有
\[i\equiv86583718\pmod{998244353}
\]
所以只需要一个多项式 \(\exp\) 就可以了。
\(\mathtt{Code}\)
inline auto Cos(vector <int> f) {
const int len = f.size() ;
for (int i = 0; i < len; ++i) f[i] = 1ll * f[i] * I % mod ;
auto g = Exp(f),h = Inv(g) ;
for (int i = 0; i < len; ++i) g[i] = 1ll * I2 * (g[i] + h[i]) % mod ;
return g ;
}
inline auto Sin(vector <int> f) {
const int len = f.size() ;
for (int i = 0; i < len; ++i) f[i] = 1ll * f[i] * I % mod ;
auto g = Exp(f),h = Inv(g) ;
const int x = ksm(I << 1) ;
for (int i = 0; i < len; ++i) g[i] = 1ll * x * (g[i] - h[i] + mod) % mod ;
return g ;
}