前置技能
引入
给定
n,s,a0,a1,a2,a3,求
∑i=0n(in)siaimod4
答案对
998244353取模
1≤n≤1018,1≤s,a0,a1,a2,a3≤108
一脸绝望
在高中的时候,数学老师教会了我们
(a+b)n=∑i=0n(in)aibn−i,然后惊喜的发现这道题不能这么做!
在
OI中,我们学习了单位根的基本性质(如果还未学,可从
前置技能部分的
单位根处点击链接学习),关于单位根还有一个迷之用法——单位根反演
构造生成函数
对于数列
ai,构造其生成函数
f(x)=∑i=0naixi
现在我们想知道所有下标是
k的倍数的
ai的和,既
∑i=0nai[k∣i]
一个关于[n∣k]的等式
有一个关于
n次单位根
wn的等式,看起来十分有趣
毒瘤
[n∣k]=n1∑i=0n−1ωnki
证明
如果
n∣k,设
k=np,则
n1∑i=0n−1wnnpimodn=n1∑i=0n−1wn0=1
注:
npimodn=(nmodn)×(pimodn)=0×(pimodn)=0
如果
n∤k,根据等比数列求和公式,则
n1∑i=0n−1ωnki=n1(wn01−wnk1−ωnk(n−1))=n(1−ωnk)wn0−wnkn=0
于是对于
N次单位根
wN可以这么搞:
N∑i=0N−1f(wNi)=N∑i=0nai∑j=0N−1wNij=∑i=0nai[N∣i]
于是就可以得到所有下标是
N的倍数的
ai的和了
有一个问题
但是发现,只知道所有
N∣i的
ai的和还不够有用,如果分别知道
imodN∈[0,N−1]的
ai的和的话就十分有用了
数学老师告诉我们,
f(x)通过乘以
x的若干次幂可以实现函数的平移(虽然说这句话不太严谨……但还是可以凑合着看看……)
比如说现在有
f(x)=a0x0+a1x1+a2x2+…
对其乘上
x−1后会得到
f(x)x−1=a0x−1+a1x0+a2x1+…
再用上面的方法求后就得到了
Nmodi=1的所有
ai和
回到例题
在这道题中,构造
f(x)=∑i=0n(in)sixi1n−i=(sx+1)n
则答案为
∑i=03aici,其中
ci=j=0∑n(jn)sj[jmod4=i]
对于
ci的
f(ωNj),因为需要将
ωNj向右平移
i次,只需要将其变为
ωNijmod4f(ωNj)即可
扩展到矩阵上
题目描述
∑i=0⌊kn⌋(ikn)Fik
其中
F0=F1=1,且
∀n≥2,Fi=Fi−1+Fi−2
1≤n≤1018
1≤k≤20000
1≤p≤109
pmodk=1
题解
单位根反演的结论在矩阵意义上也是成立的
也就是说求
∑i=0n(in)Fi[k∣i]
设
A是斐波那契数列的转移矩阵,
I为单位矩阵
通过套用二项式定理,有
f(x)=(Ax+I)n=∑i=0n(in)AixiIn−i
再套用单位根反演,有
T=k∑i=0k−1f(ωki)
总结
如果想计算序列
a0,a1,a2,…,an的所有满足
k∣i的
ai的和的话
首先构造
f(x)=∑i=0naixi
然后将
ωki(i∈[0,k−1])依次代入到
f(x)中,并求和
也就是说
∑i=0nai[k∣i]=k1∑i=0k−1f(ωki)
参考文献