这里有一道经典的例题,可以看一下:点击打开链接
这里的n可能要大于k的,所以不能用欧拉函数去做。
我们首先把k分解质因数,储存到p数组中,num表示质因子的数量。
void pr(int k) //求k的质因子
{
num = 0;
for (int i = 2 ; i * i <= k ; i++)
{
if (k % i == 0)
{
p[num++] = i;
while (k % i == 0)
k /= i;
}
}
if (k > 1)
p[num++] = k;
}
然后用容斥原理,我们反着求不与k互质的数的个数,到时候一减就得出结果了。
举个例子,比如 k 的质因子有 2,3,5。那么2、3、5的倍数都不和 k 互质,另外还没有完,可能有重复的地方&#x