题目描述: 点击打开链接 题意给定一个区间[a,b],求区间内有少个数与n互质。 题意很简单但是不是很好处理,a,b的数据范围很大,肯定不能够直接遍历,欧拉函数也不很好解决这个问题,我们把这个问题转换一下,互质的数是没有规律可循的,只能一个一个找,但是不互质的数就不一样了,如果将n因式分解,假设可以得到三个因子p1,p2,p3的话,那么p1,p2,p3的倍数肯定是与n不互质的,而n以内一个数的倍数的个数又是很好求的直接用n去除就好了,所以这个的思路就转换成先求不互质的个数,再用总数减去。那么现在的问题就是一个区间[1,x]内与n不互质的个数怎么求? 这里就要引入容斥原理,容斥原理我认为不算一个具体的算法,他没有具体的模版,他其实是一种思想,就是计数的时候可以先分别计算求和,然后再把重复计算的部分给去掉,所以容斥原理的核心也就是该如何去掉重复计算的部分,去重的方式对于不同的题目也都不尽相同,这个题就是一个最典型的应用容斥的题。 回到这个题。举个例子,假设n=30,因子显然为2,3,5,假设x=45,如果直接分别求的话2的倍数有22个,3的倍数有15个,5的倍数有9个但是这其中显然有重复的部分,比如6就在算2,3的时候都算了一遍。在这种情况下我们在纸上稍微画一个韦恩图的话就很容易找到去重的方法,假设我们以开始就2,3,5的倍数都分开计算求和得到46,这时我们会发现6的倍数在计算2,3的倍数的时候都计算一遍,15的倍数在计算3,5倍