题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1787
题目大意:
给你一个整数N,求范围小于N中的整数中,与N的最大公约数大于1的整数的个数。
思路:
典型的欧拉函数变形。欧拉函数φ(N)是用来求小于N的整数中,与N的最大公约数为1的数的个数。
那么此题的答案ans = N - φ(N) - 1。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int Euler(int n)
{
int ret = n;
for(int i = 2; i*i <= n; ++i)
{
if(n % i == 0)
{
n /= i;
ret = ret - ret/i;
}
while(n % i == 0)
n /= i;
}
if(n > 1)
ret = ret - ret/n;
return ret;
}
int main()
{
int n;
while(~scanf("%d",&n) && n)
{
printf("%d\n",n-Euler(n)-1);
}
return 0;
}