题意:给一个数n,求小于n的数中,有多少个数与n的最大公约数大于1。
思路:欧拉函数。欧拉函数的意义是小于n的数中,有多少个数与n互质,正好是题目要求的对立面。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <memory.h>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <ctype.h>
#define ll long long
#define max3(a,b,c) max(a,max(b,c))
using namespace std;
int main(){
int n;
while(cin>>n){
if(!n)break;
int nn=n;
int tmp=n;
int m=sqrt(n+0.5);
for(int i=2;i<=m;i++){
if(n%i==0){
tmp=tmp/i*(i-1);
while(n%i==0)n/=i;
}
}
if(n>1)tmp=tmp/n*(n-1);
ll ans=nn-tmp-1;
cout<<ans<<endl;
}
return 0;
}