多項式(polynomial)
題目大意:
給出一個 n 次多項式
\(f(x)=\sum_{i=0}^na_ix^i\)
對於\(k ≤ x ≤ k + l − 1\) 的\(l\) 個\(x\),分別求出\(f(x)\) 的值。由於答案可能會很大,你只需:輸出\(f(x) \space mod \space 10^m\)的結果。
第一行共四個整數\(n, k, l,m\),中間用一個空格隔開,含義如題意所述。接下來\(n+1\)行,每行一個整數,依次給出了\(an, an−1, . . . , a0\)。
- 【算法要點】
- 高精度運算差分
- 【算法一】
- 有10%的數據,所有數字都在 \(10^9\) 以內,直接做就行了。
- 時間復雜度 \(O(nl)\),期望得分 \(10\) 分。
- 【算法二】
- 由於答案是模 \(10^m\) 的,所以把所有數都模 \(10^m\) 答案不變。於是現在所有數字都在 \(10^{18}\) 以內,直接做就行了。不過可能會遇到兩個\(10^{18}\) 以內的數相乘,如果不想寫高精度就用快速乘算法。
- 時間復雜度 \(O(nl \log_2(10^{18}))\),期望得分 \(30\) 分。
- 【算法三】
- 寫高精度,並壓位。
- 時間復雜度 \(O(nl({m \over w})^2)\),其中 \(w\) 為壓的位數。期望得分 \(60\) 分。
- 【算法四】
- 把算法三中的高精度乘法用FFT等算法實現。
- 時間復雜度 \(O(nl{m \over w} \log_2m)\),常數超大,期望得分 \(60 \sim 80\) 分。
- 【算法五】(標准算法)
- 本題的關鍵是通過差分把乘法轉化成加減法。
- 把 \(f(x)\) 差分,即令多項式 \(g(x) = f(x + 1) - f(x)\),得到的 \(g(x)\) 是一個 \(n - 1\) 次多項式,不妨定義其為 \(f^{(n-1)}(x)\) 。
- 同理,差分兩次后得到一個 \(n-2\) 次多項式,設其為 \(f^{(n-2)}(x)\)
- ……
- 這樣下去,差分 \(n\)次后就能得到一些常數。
- 令\(a[i][j] = f(i)(𝑘-1+j)\),首先暴力做 \(n+1\) 次算出 \(a[n][1] ∼ a[n][n+1]\)。
- 然后根據 \(a[i - 1][j] = a[i][j + 1] - a[i][j]\),可以對每個 \(a[i]\) 算出前 \(i + 1\) 項。
- 由於 \(a[0][j]\) 都是常數,所以對於 \(j > i + 1\) 的,根據 \(a[i][j] = a[i][j - 1] +a[i - 1][j - 1]\),就可以推出\(a[i]\) 的前 \(l\) 項。這里只做了 \(O(nl)\)次加法運算。時間復雜度 \(O(n^2({m \over w})^2 + nl{m \over w})\),期望得分 \(100\) 分。