• Source
    1. #include<bits/stdc++.h>
    2. #define MAX 46400
    3.  
    4. using namespace std;
    5.  
    6. vector<int>prime;
    7.  
    8. bool check[MAX];
    9.  
    10. int phi_value;
    11.  
    12. void sieve()
    13. {
    14. int i,j,k;
    15.  
    16. k = sqrt(MAX);
    17.  
    18. prime.push_back(2);
    19.  
    20. for(i=3; i<=k; i+=2)
    21. {
    22. if(check[i]==0)
    23. {
    24. for(j=i*i; j<MAX; j+=i+i)
    25. {
    26. check[j]=1;
    27. }
    28. }
    29. }
    30.  
    31. for(i=3;i<MAX;i+=2)
    32. {
    33. if(!check[i])
    34. prime.push_back(i);
    35. }
    36. }
    37.  
    38. int countDivisor(int n)
    39. {
    40. int cnt=0,divisor = 1;
    41.  
    42. int i,len = prime.size();
    43.  
    44. for(i=0; i<len && prime[i]*prime[i]<=n; i++)
    45. {
    46. cnt = 0;
    47.  
    48. if(n%prime[i]==0)
    49. {
    50. while(n%prime[i]==0)
    51. {
    52. n/=prime[i];
    53.  
    54. cnt++;
    55. }
    56.  
    57. phi_value-=(phi_value/prime[i]);
    58.  
    59. divisor*=(cnt+1);
    60. }
    61. }
    62.  
    63. if(n>1)
    64. {
    65. phi_value-=(phi_value/n);
    66.  
    67. divisor*=2;
    68. }
    69.  
    70. return divisor;
    71. }
    72.  
    73. int main()
    74. {
    75. sieve();
    76.  
    77. int n,Divisors;
    78.  
    79. while(scanf("%d",&n)==1)
    80. {
    81. phi_value = n;
    82.  
    83. Divisors = countDivisor(n);
    84.  
    85. printf("%d\n",n-phi_value-Divisors+1);
    86. }
    87.  
    88. return 0;
    89. }