3b1b 题 多项式+单位根

原视频链接

我这里梳理一下思路,并夹带个人私货。

S={1,2,,2020},问有多少个 TS,使得 T 的元素和为 5 的倍数(空集的元素和定义为 0)。

要手算能得出答案的方法。

我们很快发现很难暴力算,想到背包,即多项式

f(x)=i=12020(1+xi)

其中 x5k(kN) 的系数和即为答案。

但是这出锅了,我们很难统计上述的答案。

我们先考虑简单版本:x2k(kN) 的系数和。

发现我们可算 f(1),f(1),然后 f(1)+f(1)2 即为所求。

发现上述方法可行的主要原因是 f(1),f(1)x 的奇数次幂被抵消了。

x5k(kN) 是否能抵消出来呢?

想到单位根,即 ω5=1

学过 FFT 的小盆友都知道(相当于傅里叶变换):

i=04ωik=5[ikmod5=0]=5[kmod5=0]

我们求 f(ω0),,f(ω4),由上面这个柿子,得到

15i=04f(ωi)=15ji=04([xj]f)ωij=15j([xj]f)i=04ωij=j([xj]f)[jmod5=0]

即为答案。

(这巧妙运用了单位根循环的特性)

所以我们的任务变为了求 f(ω0),,f(ω4)

若有 x5=1 的条件则

f(x)=g(x)404g(x)=i=04(1+xi)

由于 5 是素数,得到

{ωi,ω2i,,ω4i}={ωj,ω2j,,ω4j}(1i,j4)

所以

f(ωi)=f(ωj)(1i,j4)

所以答案简化成

f(ω0)+4f(ω1)5=f(1)+4f(ω)5=22020+4f(ω)5

任务简化成求 f(ω),等价于 g(ω)

g(ω)=i=04(1+ωi)=i=04((1)ωi)

这时候,我们回到开始的开始……单位根的定义 x51=0,我们将 x51 因式分解得到

x51=i=04(xωi)

所以上面 g(ω) 的柿子相当于将 x=1 带入了,所以

g(ω)=((1)51)=2

皆大欢喜!我们最终的答案为

22020+4×24045=22020+24065

(验算一下分子真的是 5 的倍数)

当然如果将 2020 换成非 5 的倍数(如 2022)也是可做的,但是

f(ωi)=f(ωj)(1i,j4)

就不成立了,所以我们 5f 都要算(甚至可能后面 (1+ω) 的因子消不完),较为麻烦。

当然将 5 换成别的素数也是可行的,非素数的做法也类似。

posted @   ShaoJia  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示