• 周二. 5月 7th, 2024

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

2021/8/18 随笔(区间互质)

admin

11月 28, 2021

根据二项式定理有

 

 这个公式配合容斥可以解决区间互质问题。

在考虑两个区间互质的情况之前我们先考虑它的一个子问题,一个数x与一个区间[l,r]的互质问题。

处理这个问题,最简单的方法肯定是遍历区间,复杂度为O(n),n为区间长度,显然太慢。

这时我们可以逆向思维,转换问题,我们可以考虑求不互质的个数,然后再用全部个数减去不互质的个数。

不互质也就是说,有公共的因子,如果把问题转换成求同有某个因子的数量,那就好处理, 比如如果计算都有因子2,设区间为[l,r],那我们只要计算1~r的个数减去1~l-1的个数,也非常好算,只要r/2-(l-1)/2 就可以计算出区间[l,r]中有因子2的数字的数量(这里的除法若无特殊说明都为整数除法,即向下取整)。

这样我们就可以把数x进行因数分解,然后对每一个因数去计算区间中有几个数同时有这个因数,累加到sum[i](i为当前这个因数中有几个质因子),这样我们就把区间中的数分类到了,几个集合中,数sun[i],就表示区间中与x共有i个质因子的数的数量,当然这些集合并不是区间的一个划分,因为这几个集合是有共有部分的,这时我们就用到我们上面推出的公式了。

假设区间中一个数y与x的共有质因子数量为1,那在sum[1]中会对他算一次,sum[2]中会对它算0次.

如果共有质因子的数量为2,那sun[1]中会对它算2次(比如y有质因子(2,3),x有质因子(2,3,5),这时取2,计算了一次,取3又计算了一次,所以是两次),sum[2]对他计算1次。

同样,如果共有质因子的数量为2,那sun[1]中会对它算3次,sum[2]对他计算3次(3个中选2个),sum[3]是一次,sum[4]零次。

由此我们可以列一个表格

    1  2  3  4  5

1  1  0  0  0  0

2  2  1  0  0  0

3  3  3  1  0  0

4  4  6  4  1  0

5  5  12  12   5  1  

很明显,第i行第j列的值就是C(i,j),我们要通过容斥将每一列通过四则运算得出一列全为1的数,这时利用到上面的公式:

根据公式,实际上我们从行第一个开始向后,加减加减的累和,最后的结果就是1.

所以,得出数x对区间[l,r]不互质的个数为

所以,x对区间[l,r]的互质个数为

 既然已经可以算出x对区间[l,r]的个数了,那两个区间的同样,遍历一遍另一个区间然后按同样的方法就可以计算得出。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注