题目链接:
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; }
时间: 2024-10-16 03:04:34