P4245 模板 任意模數多項式乘法

2022-06-16 09:48:14 字數 739 閱讀 2373

首先這類問題指的是對於乙個非ntt模數,我們如何計算多項式乘法,對於ntt不容易找到單位根,對於fft又會爆精度。

方法1:三模數ntt

尋找三個大模數最後crt合併即可

方法2:mtt

將係數拆分為兩部分,分別是m的倍數和餘數,然後我們只需要對其分別處理即可,但是這樣暴力的做一共需要7次fft複雜度太高,我們通過一些數學技巧可以優化到4次。

首先dft時可以發現虛部是空的,我們可以將另乙個多項式放在虛部,然後利用共軛求解共軛的值,然後就可以一次求出兩個多項式的點值,所以可以將4次dft變為2次。

然後idft時,發現點值最後轉化為係數時虛部也是空的,所以我們可以將兩個多項式加在一起idft,可以發現如果給係數乘i,那麼點值對應乘i,所以對應的虛部點值不會影響到實部的係數。

**細節:

取整問題

floor是向下取整

ceil是向上取整

強制轉換是向0取整

所以我們要四捨五入需要判斷正負,對於負數-0.5後取整,對於正數+0.5後取整。

這裡需要維護的complex操作太多了,自己寫結構體太麻煩了,還是直接用complex庫里封裝好的型別吧。

我暈了啊,竟然是一開始讀入時候m設定為根號n了,天哪,怪不得會爆掉

還有乙個小細節,就是原來fft裡可以不用設定為-sin,直接最後或者一開始的時候reverse就好了,因為這樣也相當於將其設定為-k

記得一旦有乘法就要檢查是否會爆int,有些時候我們不得不先除後乘,否則就會爆掉。

P4245 模板 任意模數多項式乘法

首先這類問題指的是對於乙個非ntt模數,我們如何計算多項式乘法,對於ntt不容易找到單位根,對於fft又會爆精度。方法1 三模數ntt 尋找三個大模數最後crt合併即可 方法2 mtt 將係數拆分為兩部分,分別是m的倍數和餘數,然後我們只需要對其分別處理即可,但是這樣暴力的做一共需要7次fft複雜度...

P4245 模板 任意模數多項式乘法

兩個多項式,求它們的乘積模 p 方法好像挺多,我用的是最簡單的一種就是,先定乙個常數 sqq 一般是 sqrt q 把乙個項的數 x 拆成 k sqq r 然後把 f 的 k 丟進 a r 丟進 b g 的 k 丟進 c r 丟進 d 然後對於 a c 的部分就是 sqq 2 的部分,a d b c...

洛谷P4245 模板 任意模數多項式乘法

給定 2 個多項式 f x g x 請求出 f x g x 係數對 p 取模,且不保證 p 可以分解成 p a cdot 2 k 1 之形式。n leq 10 5 a,b leq 10 9 p leq 10 9 9 不保證 p 是 ntt 模數,所以不能直接用 ntt 做。一般有兩種處理方法,一是用...