?
求连续区间[a,b]内与n互质的数的个数。
因为a,b相当大,考虑用容斥原理。只需先求出[a,b]内与n不互质的数的个数,等于[1,b]内与n不互质的个数 - [1,a-1]内与n不互质的个数。问题转化为求【1,m】内与n不互质的数的个数。
先对n分解质因子,[1,m]内是n的质因子的倍数的那些数肯定与n不互质,但是有许多重复的,需要减去。质因子解法有多种,队列数组或状态压缩。
例如30的质因子是2,3,5,[1,m]内与30互质的数的个数表示为 n/2 + n/3 + n/5 - n/(2*3) - n/(2*5) - n/(3*5) + n/(2*3*5)。发现质因子个数是奇数的做加法,是偶数的做减法。队列数组解法为模拟一个队列,初始将1加入队列,之后每次取出n的一个质因子依次与队列中的数相乘后置于队尾,每次乘-1决定其前面的正负号。最后队列里的就是上式所有的分子,然后解之。 状态压缩便是将取出的质因子置为1没取出的置为0,得到一个数res,若res的质因子个数是奇数就加上,是偶数就减,求和就是与m不互素的数的个数,解之。
?
?
#include
#include
#include