- #include <iostream>
- using namespace std;
- #define N 100000001
- int euler(int n)
- {
- int ans=1;
- int i;
- for(i=2;i*i<=n;i++)
- {
- if(n%i==0)
- {
- n/=i;
- ans*=i-1;
- while(n%i==0)
- {
- n/=i;
- ans*=i;
- }
- }
- }
- if(n>1)
- ans*=n-1;
- return ans;
- }
- int main()
- {
- int n;
- while(scanf("%d",&n),n)
- {
- printf("%d/n",n-1-euler(n));
- }
- return 0;
- }
下面是另外一种(筛选法)
- #include <iostream>
- using namespace std;
- #define N 100005
- #define ll __int64
- ll eule[N];
- int p[N][15];
- int num[N];
- void init()
- {
- int i,j;
- eule[1]=1;
- for(i=2;i<N;i++)//筛选法得到数的素因子及每个数的欧拉函数值
- {
- if(!eule[i])
- {
- for(j=i;j<N;j+=i)
- {
- if(!eule[j])
- eule[j]=j;
- eule[j]=eule[j]*(i-1)/i;
- p[j][num[j]++]=i;
- }
- }
- eule[i]+=eule[i-1];
- }
- }