为了好看,设 W=w(
用点普及知识可以知道答案实际上就是 anst=L∑m=1[m≡t(modk)](Lm)Wmx,y
然后套个单位根反演 anst=L∑m=1[m≡t(modk)](Lm)Wmx,y=1kk−1∑d=0ω−dtkL∑m=1(Lm)Wmx,yωdmk=1kk−1∑d=0ω−dtk(Wωdk+I)Lx,y
设 cd=(Wωdk+I)Lx,y。
那么原式就变成了 anst=1kk−1∑d=0cdω−dtk
然后你发现这是 DFT 的标准形式。
然后你敲了个 FFT 上去。
然后然后然后你发现 k 不一定是二的次幂。
然后考虑多点求值(大雾)
然后考虑使用 Bluestein's Algorithm。
(没有写进标签是因为个人感觉这个东西在 OI 界大概也就当个 trick 用)
大概就是把 dt 拆成 (d+t)22−d22−t22。
然后会发现好像没有二次剩余耶(
那么就拆成 (d+t2)−(d2)−(t2) 就好辣(
anst=1kk−1∑d=0cdω−dtk=1kk−1∑d=0cdω−(d+t2)+(d2)+(t2)k=ω(t2)kk−1∑d=0cdω(d2)k⋅ω−(d+t2)k
设 fi=ciω(i2)k,gi=ω−(i2)k,那么就是求一个 anst=ω(t2)kk−1∑d=0fdgd+t
这个可以简单地设 g′2k−i−1=gi 解决。 anst=ω(t2)kk−1∑d=0fdg′2k−d−t−1
当然,要先求原根再动手(
代码:
1 |
|