1. 程式人生 > >[BZOJ5020][THUWC 2017]在美妙的數學王國中暢遊(LCT + 一點數學知識)

[BZOJ5020][THUWC 2017]在美妙的數學王國中暢遊(LCT + 一點數學知識)

Address

Solution

  • 如果只有一次函式 a x + b ax+b ,那麼這是非常裸的 LCT ,維護 a
    a
    之和與 b b 之和即可
  • 然後你會發現
  • e a
    1 x + b 1 ×
    e a 2 x + b 2 = e ( a 1 x + b 1 ) ( a 2 x + b 2 ) = e a 1 a 2 x 2 + ( a 1 b 2 + a 2 b 1 ) x + b 1 b 2 e^{a_1x+b_1}\times e^{a_2x+b_2}=e^{(a_1x+b_1)(a_2x+b_2)}=e^{a_1a_2x^2+(a_1b_2+a_2b_1)x+b_1b_2}
  • 冪中有 x 2 x^2 的項,照這樣的話如果一條路徑很長,那麼使用到的 x x 的最高次冪與路徑上的點數相同,無法簡單維護
  • sin \sin 甚至沒有可加性
  • 回到 a x + b ax+b ,我們可以很容易地推廣到,如果不是一次函式而是 m m 次多項式( m m 較小),那麼我們同樣可以通過維護多項式每一次項係數的和,做到 O ( n m log n ) O(nm\log n) 的優秀複雜度
  • 這讓我們思考能不能把 sin \sin exp \exp 轉化成多項式
  • 先科普下泰勒展開
  • f ( x ) = i = 0 f ( i ) ( x 0 ) ( x x 0 ) i i ! f(x)=\sum_{i=0}^{\infty}\frac{f^{(i)}(x_0)(x-x_0)^i}{i!}
  • 其中 f ( i ) ( x ) f^{(i)}(x) 表示 f ( x ) f(x) i i 階導數
  • 一般地,為了讓函式轉成多項式的形式,我們通常取 x 0 = 0 x_0=0
  • sin ( a x + b ) \sin(ax+b) e a x + b e^{ax+b} 是複合函式
  • 可以按照 h ( x ) = f ( g ( x ) ) , h ( x ) = f ( g ( x ) ) g ( x ) h(x)=f(g(x)),h'(x)=f'(g(x))g'(x) 進行求導
  • 於是我們得到
  • sin ( a x + b ) = i = 0 a i orz ( i , b ) i ! x i \sin(ax+b)=\sum_{i=0}^{\infty}\frac{a^i\text{orz}(i,b)}{i!}x^i
  • 其中
  • orz ( i , x ) = { sin x i   m o d   4 = 0 cos x i   m o d   4 = 1 sin x i   m o d   4 = 0 cos x i   m o d   4 = 3 \text{orz}(i,x)=\begin{cases}\sin x&i\bmod 4=0\\\cos x&i\bmod 4=1\\-\sin x&i\bmod 4=0\\-\cos x&i\bmod 4=3\end{cases}
  • e a x + b = i = 0