标签:相同 模拟 核心 text 时间复杂度 www pre width microsoft
哒哒哒哒哒......
想要学好莫比乌斯反演,那么整除分块,你一定要会!
for(int l=1,r;l<=n;l=r+1) { r=n/(n/l); ans+=(r-l+1)*(n/l); }
如果你很懒很懒,以至于不想自己模拟的话,那么我们就来举个栗子吧!
当n=22时
首先,手动打表得到(向下取整后的结果):
我们不难看出:
有重复+有分块!
因为是向下取整,所以得到的结果乘以这个块里最大的那个数(i)所得的积在这个块里离原数(n=22)最近;又因为i是从小到大的。
所以:在同一块内,它的最后一个数(序号)就是n/(n/i)。
(如果图片看不太清,请将图片用浏览器打开,又大又清晰)
白色部分可以清晰看出,在那个块里只有一个数。
而未标记部分所属的块里有很多数,其实在这里也可以看出整除分块的优越性。
over!
参考相关博客:http://www.cnblogs.com/peng-ym/p/8661118.html
标签:相同 模拟 核心 text 时间复杂度 www pre width microsoft
原文地址:https://www.cnblogs.com/zcy0917/p/10225594.html