整数个数
金牌导航 欧拉函数-1
题目大意
问1~n-1中满足x ∤ \nmid ∤n且不与n互质的数有多少个
输入样例
10
输出样例
3
样例解释
3个数分别是4,6,8
数据范围
0 ⩽ n ⩽ 2 31 0\leqslant n\leqslant 2^{31} 0⩽n⩽231
解题思路
因为互质和整除的子集是独立的(1除外),所以求出这两个子集大小,然后用n减去即可
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int n, m, p, ans, ans1;
int main()
{
scanf("%d", &n);
m = ans = n;
ans1 = 1;//1也和n互质,不重复计算
for (int i = 2; i * i <= n; ++i)
{
p = 0;
while(m % i == 0) m /= i, p++;
if (p) ans = ans / i * (i - 1);//欧拉函数
if (n % i == 0) ans1 += 2;//因子是成对的
if (i * i == n) ans1--;//如果和自己成对,那么不重复计算
}
if (m > 1) ans = ans / m * (m - 1);
printf("%d", n - ans - ans1);
return 0;
}