20分:我不会。
40分:考虑先求这样一个数组:表示lcm
的指数中,最多是,的方案数有多少种。
比如,就会存所有lcm
恰好是的方案。
你可以把读入的看成一个坐标,那么就相当于枚举所有坐标,求它左下角有多少个数字。
求出来数组后,我们用代表恰好是的方案数。那么数组显然就是的二维意义下的前缀和,随便怎么都能恢复回去。
60分:离散化一下其实就是40分。
100分:
我们考虑把所有点按照从小到大排序,然后枚举第个点作为最大的值来计算答案。
这时候,我们用一棵线段树来维护所有这些点对应的。
线段树的下标表示的是。
比如第一个点是,我们就在线段树第个位置,表示的元素多了一个。
考虑一下怎么算答案:
其实就是枚举对应的指数,然后在线段树上查询的元素有多少个(记作),以及的元素有多少个(记作),然后用作为此时答案的贡献。
这个东西显然可以直接在线段树上维护。
对于插入一个点来说,其实就是所有的位置,贡献都是原先的两倍,的位置,如果原先没有元素,那么贡献就是所有的元素个数之和的,如果原先有元素,那么贡献就按上面的做法重新算一遍。
具体涉及到的就是线段树查询区间和,修改单点,以及区间,很好写。