@ACの666
感谢投稿,有待改进:
杜教筛复杂度证明如下:
首先,数论分块O(n)的证明:对于⌊in⌋,当i≤n时有O(n)种,当i>n时⌊in⌋≤n有O(n)种
杜教筛的复杂度即T(n)=∑i=1ni+in
T(n)<∫1n(i+in)di=O(n3/4)
所以裸的杜教筛复杂度为O(n3/4)
现在有个优化叫做“前S项(S>n)线性预处理"。此时杜教筛复杂度变成了:T(n)=∑i=1n/Sin
T(n)<∫1n/Sindi=O(n/S)
总复杂度为O(S+Sn),当S=n2/3时复杂度为最优,即O(n2/3)
同时,理解了数论分块的基本原理后,可以不用任何哈希表记忆化。所有会出现的都是⌊in⌋,所以可以开一个两倍根号的数组,按根号分配。即假设要搞Getsum(x).若x≤n,返回dp[x];否则返回dp[n/x+n]大概这样
另:杜教筛在寻找那个函数的过程中可以只考虑单个质数的函数构造,这样更方便...
另注:积分不会算就去wolframalpha.com嘛...