设f(m,n) 设m<n 即m是n的一个素因数
于是问题转化为求n的互素个数f(n)
于是个数=2*f(n)+1
其中1是f(1,1),乘以2表示,m,n反一反
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
void phi_table(int n,int *phi)
{
for(int i=1;i<=n;i++) phi[i]=0;
phi[0]=1;
for(int i=2;i<=n;i++)
if(!phi[i]) for(int j=i;j<=n;j+=i)
{
if(!phi[j]) phi[j]=j;
phi[j]=phi[j]/i*(i-1);
}
}
int f(int n,int *phi)
{
int ans=0;
for(int i=2;i<=n;i++)
ans += phi[i];
return ans;
}
int main()
{
int N;
int phi[50005];
phi_table(50001,phi);
while(scanf("%d",&N)&&N)
{
int n=f(N,phi);
cout<<2*n+1<<endl;
}
return 0;
}