给定长度为 n 的数组,需要处理两类操作:
若每次查询都线性扫描数组,时间为 O(n),在 n、q 均为 2×10^5 的规模下会超时。 关键观察:一个数能否被 k 整除,只与它的所有“因子关系”有关。我们可以把问题转化为按“可整除值”统计频次:
给定一个长度为 n 的数组 {a1,a2,...,an}。你需要依次处理 q 次操作,每次操作属于两种类型之一:
查询:给定整数 k ,统计整个数组中有多少个数可以被 k 整除;
修改:将位置 i 的数值改为 2 (数组下标从 1 开始)。
第一行输入两个整数 n,q(1≦n,q≦2×105),表示数组长度与操作次数
第二行输入 n 个整数 a1,a2,…,an(1≦ai≦2×105),表示初始数组
此后 q 行,每行表示一次操作:
若为查询,输入两个整数 1 k(1≤k≤2×105)
若为修改,输入三个整数 2 i x(1≦i≦n;1≦x≦2×105)
对于每一次查询操作,输出一行答案
输入
5 6
2 3 4 5 6
1 2
1 3
2 3 9
1 3
2 5 12
1 6
输出
3
2
3
1
说明
初始数组为 {2,3,4,5,6}
查询 k=2 :可整除的为 {2,4,6},答案为 3 。
查询 k=3 :可整除的为 {3,6},答案为 2 ;