ans=n-1-Eular(n)
Eular(n)表示欧拉函数,[1,n]区间内与n互质的整数的个数
通式:Eular(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,x是不为0的整数。
Eular(1)=1(唯一和1互质的数(小于等于1)就是1本身)
顺便提一下,有一个有意思的公式:一个数的所有质因子之和是Euler(n)*n/2。
求法有多重,比如分解质因数、筛选法、公式法
下面的代码就是公式法:
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
typedef __int64 i64;
i64 Eular(__int64 n)
{
i64 ans = n;
for (int i = 2; i*i <= n; i++)
{
if (n%i == 0)
{
ans -= ans / i;
while (n%i == 0)
n /= i;
}
}
if (n > 1) ans -= ans / n;
return ans;
}
void work(i64 n)
{
i64 ans;
ans = Eular(n);
ans = n - 1 - ans;
printf("%I64d\n",ans);
}
int main()
{
i64 n;
while (scanf("%I64d", &n), n)
work(n);
return 0;
}