题目要求支持两种操作:询问给定整数 k 时,序列中有多少个数能被 k 整除;以及单点修改某个位置的值。序列长度和操作次数均可达到 2×105,每次询问都扫描整个序列会超时。
关键观察:一个数能否被 k 整除,只与它的因子有关。我们可以把问题转化为维护每个除数对应的倍数个数:
cntMul[d]:表示当前序列中能被 d 整除的元素个数。1 k,直接输出 cntMul[k],时间复杂度 O(1)。2 i x,设旧的值为 old,新的值为 x。我们需要将 old 的所有因子 d 在 cntMul[d] 中减 1,再将 x 的所有因子 d 在 cntMul[d] 中加 1,最后将序列中下标 i 的元素更新为 x。divisors 数组中。预处理复杂度约为 O(MAXAlogMAXA)。在一个数据处理任务中,需要维护一个长度为 n 的整数序列,并依次响应用户的 q 次操作。操作分为两种类型:
请你为每次询问输出对应的答案。
序列的长度 n 与操作总数 q 均不超过 2×105,所有涉及到的整数值(包括初始序列的元素、询问中的 k 以及更新中的 x)均不超过 2×105。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册