题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5726
第一问很好做,一个数与它自己的GCD仍是自己,所以区间GCD可以直接用ST表维护。
第二问就比较麻烦了。要做出第二问需要用到几个性质:
- GCD具有区间单调性(若a<=c<=d<=b,那么GCD(a,b)<=GCD(c,d))
- 一个数的因子不超过log(n)个
第一个性质使得二分区间边界成为可能,而有了第二个性质我们就可以枚举每一个左边界,并在这个左边界的前提下尽量向右「扩展」,找到GCD相同的最大的右边界,并把这个GCD下的区间数用map维护;接下来更改GCD(这里GCD是减小了)并继续向右拓展右边界,直到拓展到区间尽头,然后枚举下一个左边界并重复上述步骤。可以证明对于每个左边界,GCD相同的右边界有最多log(n)个(第二个性质)。这样整个初始化过程时间复杂度为O(n * log(n))
这样就统计完了每个GCD对应的区间数。
1 |
|