給定\(F(a_0,a_1...a_n)_3\),\(G(a_0,a_1...a_n)_3\)
定義\(a \oplus b\) 為3進制不進位加法,求$ Ans= F \oplus G$ ,即求
part 1
我們先考慮\(n\)為\(1\)的情況,可以發現這就是一個長度為\(3\)的循環卷積。
因為該卷積的元素個數很少,我們考慮如何對多項式\(A(x)\)暴力求\(DFT(A(x))\)和\(IDFT(A(x))\)。
回想一下\(DFT\)是在做什么,它相當於是給定多項式\(A(x)\)各位的系數\(a_i\),對多項式\(A(x)\)求\(x=\omega_n^0,\omega_n^1...\omega_n^{n-1}\)時的值。
\(IDFT\)就是給定多項式\(A(x)\)在\(x=\omega_n^0,\omega_n^1...\omega_n^{n-1}\) 的值,求多項式\(A(x)\)各位的系數\(a_i\)。
考慮一下以下矩陣(范德蒙德矩陣)
我們發現對\(A(x)\)求\(DFT\)就是對\(A(x)\)所表示的向量乘上矩陣\(T_n\)
考慮\(T_n\)的逆矩陣
可以證明該矩陣是\(T_n\)的逆矩陣(當然我不會啦)
那么對\(A(x)\)求\(IDFT\)就是對\(A(x)\)所表示的向量乘上矩陣\(T_n^{-1}\)
對於一個大小為\(3\)的多項式,我們只要先求出\(3\)次單位根,再暴力乘上一個\(3*3\)的矩陣就好了
Part 2
若\(n>1\),那么我們要求一下式子(為了方便以下式子都省略\(\bmod 3\))
我們不妨先枚舉\(a_1,a_2...a_n,b_1,b_2...b_n\),
我們此時只要對\(F,G\)的第一維做循環卷積就好了。
假設我們已經對\(F(a_0,x,y...z)\)和\(G(b_0,u,v...w)\)的第一維做了\(DFT\)變換
此時我們要求:
然后再對 \(Ans\) 的第一維做\(IDFT\)變換
我們考慮求解它的一個子問題
即枚舉\(F,G\)的第一維,再枚舉\(F,G\)除第二維以后的后面幾維
我們發現這個形式和上面的形式差不多,我們此時再對\(F,G\)第二維做\(DFT\)變換,再解決一個子問題,再對\(Ans\)
第二維做\(IDFT\)變換
我們這樣遞歸下去,發現我們就是對\(F,G\)的\(1 \to n\)維做\(DFT\)變換,再對\(F,G\) 對應的點值相乘,再做\(IDFT\)變換
偽代碼:
FWT(A),FWT(B)
for(i=0~(3^n)-1) A[i]*B[i]->Ans[i]
IFWT(Ans)
復雜度\(O(3^n n *3^2)\)
若將\(3\)換成\(d\),復雜度為\(O(d^n n* d^2)\)或\(O(d^n n* d logd)\)