3b1b 题 多项式+单位根
我这里梳理一下思路,并夹带个人私货。
\(S=\{1,2,\dots,2020\}\),问有多少个 \(T\subseteq S\),使得 \(T\) 的元素和为 \(5\) 的倍数(空集的元素和定义为 \(0\))。
要手算能得出答案的方法。
我们很快发现很难暴力算,想到背包,即多项式
其中 \(x^{5k}(k\in\N)\) 的系数和即为答案。
但是这出锅了,我们很难统计上述的答案。
我们先考虑简单版本:\(x^{2k}(k\in\N)\) 的系数和。
发现我们可算 \(f(1),f(-1)\),然后 \(\frac{f(1)+f(-1)}{2}\) 即为所求。
发现上述方法可行的主要原因是 \(f(1),f(-1)\) 中 \(x\) 的奇数次幂被抵消了。
那 \(x^{5k}(k\in\N)\) 是否能抵消出来呢?
想到单位根,即 \(\omega^5=1\)。
学过 FFT 的小盆友都知道(相当于傅里叶变换):
我们求 \(f(\omega^0),\dots,f(\omega^4)\),由上面这个柿子,得到
即为答案。
(这巧妙运用了单位根循环的特性)
所以我们的任务变为了求 \(f(\omega^0),\dots,f(\omega^4)\)。
若有 \(x^5=1\) 的条件则
由于 \(5\) 是素数,得到
所以
所以答案简化成
任务简化成求 \(f(\omega)\),等价于 \(g(\omega)\)。
这时候,我们回到开始的开始……单位根的定义 \(x^5-1=0\),我们将 \(x^5-1\) 因式分解得到
所以上面 \(g(\omega)\) 的柿子相当于将 \(x=-1\) 带入了,所以
皆大欢喜!我们最终的答案为
(验算一下分子真的是 \(5\) 的倍数)
当然如果将 \(2020\) 换成非 \(5\) 的倍数(如 \(2022\))也是可做的,但是
就不成立了,所以我们 \(5\) 个 \(f\) 都要算(甚至可能后面 \((1+\omega)\) 的因子消不完),较为麻烦。
当然将 \(5\) 换成别的素数也是可行的,非素数的做法也类似。
作者:ShaoJia,欢迎分享本文,转载时敬请注明原文来源链接。

浙公网安备 33010602011771号