莫队算法Mo's algorithm

Posted shawshawwan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了莫队算法Mo's algorithm相关的知识,希望对你有一定的参考价值。

最近刷算法题遇到一个题:

 

给出一个长度为 n 的数列 { a[1] , a[2] , a[3] , ... , a[n] },以及 m 组询问 ( l[i] , r[i] , k[i])。
求数列下标区间在 [ l[i] , r[i] ] 中有多少数在该区间中的出现次数与 k[i] 互质(最大公约数为1)。

输入描述:

第一行,两个正整数 n , m (1 ≤ n, m ≤ 50000)。
第二行,n 个正整数 a[i] (1 ≤ a[i] ≤ n)描述这个数列。
接下来 m 行,每行三个正整数 l[i] , r[i] , k[i] (1 ≤ l[i] ≤ r[i] ≤ n, 1 ≤ k[i] ≤ n),描述一次询问。

输出描述:

输出 m 行,即每次询问的答案。


开始我的想法就是直接按题意做咯,但是最后显示时间复杂度过大没过,因为是O(mn)的复杂度。
于是就谷歌大神们的解法,于是搜出一个了不得的算法--莫队算法,听名字就很厉害的样子呢!尽然是个中国人发明的==。 于是详细学习了一波:






















以上是关于莫队算法Mo's algorithm的主要内容,如果未能解决你的问题,请参考以下文章

带修莫队板子

CSU 1515 Sequence (莫队算法)

Manacher's Algorithm(马拉车算法)

P1494 [国家集训队]小Z的袜子(莫队算法)

莫队算法

Manacher's Algorithm 马拉车算法