原视频链接
我这里梳理一下思路,并夹带个人私货。
S={1,2,…,2020},问有多少个 T⊆S,使得 T 的元素和为 5 的倍数(空集的元素和定义为 0)。
要手算能得出答案的方法。
我们很快发现很难暴力算,想到背包,即多项式
f(x)=2020∏i=1(1+xi)
其中 x5k(k∈N) 的系数和即为答案。
但是这出锅了,我们很难统计上述的答案。
我们先考虑简单版本:x2k(k∈N) 的系数和。
发现我们可算 f(1),f(−1),然后 f(1)+f(−1)2 即为所求。
发现上述方法可行的主要原因是 f(1),f(−1) 中 x 的奇数次幂被抵消了。
那 x5k(k∈N) 是否能抵消出来呢?
想到单位根,即 ω5=1。
学过 FFT 的小盆友都知道(相当于傅里叶变换):
4∑i=0ωik=5⋅[ikmod5=0]=5⋅[kmod5=0]
我们求 f(ω0),…,f(ω4),由上面这个柿子,得到
154∑i=0f(ωi)=15∑j4∑i=0([xj]f)ωij=15∑j([xj]f)4∑i=0ωij=∑j([xj]f)[jmod5=0]
即为答案。
(这巧妙运用了单位根循环的特性)
所以我们的任务变为了求 f(ω0),…,f(ω4)。
若有 x5=1 的条件则
f(x)=g(x)404g(x)=4∏i=0(1+xi)
由于 5 是素数,得到
{ωi,ω2i,…,ω4i}={ωj,ω2j,…,ω4j}(1≤i,j≤4)
所以
f(ωi)=f(ωj)(1≤i,j≤4)
所以答案简化成
f(ω0)+4f(ω1)5=f(1)+4f(ω)5=22020+4f(ω)5
任务简化成求 f(ω),等价于 g(ω)。
g(ω)=4∏i=0(1+ωi)=−4∏i=0((−1)−ωi)
这时候,我们回到开始的开始……单位根的定义 x5−1=0,我们将 x5−1 因式分解得到
x5−1=4∏i=0(x−ωi)
所以上面 g(ω) 的柿子相当于将 x=−1 带入了,所以
g(ω)=−((−1)5−1)=2
皆大欢喜!我们最终的答案为
22020+4×24045=22020+24065
(验算一下分子真的是 5 的倍数)
当然如果将 2020 换成非 5 的倍数(如 2022)也是可做的,但是
f(ωi)=f(ωj)(1≤i,j≤4)
就不成立了,所以我们 5 个 f 都要算(甚至可能后面 (1+ω) 的因子消不完),较为麻烦。
当然将 5 换成别的素数也是可行的,非素数的做法也类似。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义