Description
$C_i=\sum_{j+k==i}(^i_j)A_jB_k(mod 3)$,已知$A_i,B_i$,求$C_i$
Solution
我一看,诶,$\frac{C_i}{i!}=\sum_{j+k==i}\frac{A_j}{j!}\frac{B_k}{k!}$,这不是FFT裸题(模数自动忽略,看题目时还以为是减小难度的)?
写了以后发现,woc,$i!\%3$全是$0$!!!
模拟赛上只好写了个$n^2$暴力,假设$f(i)$表示$i!$中有多少个$3$,
那么$\frac{C_i}{i!}=\sum_{j+k==i,f(j)+f(k)==f(i)}\frac{A_j}{j!}\frac{B_k}{k!}$(这里$i!$已经把质因子中所有$3$都删掉了)
下面讲正解
我们先把$A,B$的长度凑成$3^k$,然后分治
每次把$A,B$分成三段,分别为$a_0,a_1,a_2$,$b_0,b_1,b_2$
考虑两个约束条件(第一个约束条件其实可以用第二个解释,我是打完这篇博客才发现的。。。)
$1.f(j)+f(k)==f(i)$
我们本来要把$a_0,a_1,a_2$,$b_0,b_1,b_2$两两相乘的,但是$a_2b_1$,$a_1b_2$,$a_2b_2$可以不用乘
我以$a_2b_1$来举例子好了,其他两个同理
假设我们分成的三部分分别为$0…k-1$,$k…2k-1$,$2k…3k-1$
$a_2$对应$2k…3k-1$,$b_1$对应$k…2k-1$
那么$a_2b_1$中每个数都在$[3k,5k-2]$的范围内
由于$b_1$中一定有$k$,那么$a_2b_1$中的$3k$与之抵消(因为消掉的都是第一个数,所以不影响别的东西),平白无故多出一个$3$,所以$f(j)+f(k)$不可能等于$f(i)$
$2.(^i_j)$
现在我们要算的是$a_0b_0$,$a_0b_1+a_1b_0$,$a_0b_2+a_1b_1+a_2b_0$,至于为什么要分三部分,看看它们每部分下标的和就知道了
可是我们还没考虑$(^i_j)$这个系数
想到组合数,就一定会想到卢卡斯定理:$(^i_j)$=$(^{i/3}{j/3})$ $(^{i\%3}{j\%3})$(不知道为什么公式打不出来,这句可以忽略)
我们惊奇地发现,这和我们分治的结构非常的相似,$imod3$,$jmod3$就对应了$a,b$的下标
系数乘上,就变成了$a_0b_0$,$a_0b_1+a_1b_0$,$a_0b_2+2a_1b_1+a_2b_0$
此时的时间复杂度为$O(n^{log_3^6})$
事实上,我们只需要求$(a_0+a_1)(b_0+b_1)$,$(a_0+a_2)(b_0+b_2)$,$a_0b_0$,$a_1b_1$,$a_2b_2$,就可以把上面六个表示出来
这样,时间复杂度就变成了$O(n^{log_3^5})$
Code
1 |
|