在某oj上看到的
做法是:单独判断%2的情况,然后就只需要搜n/2次 (省点常数)
当然,你也可以再加上判断3 , 5 ......
附代码:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#define lol long long
using namespace std;
int main()
{
lol n,ans;
while(scanf("%lld",&n) > 0)
{
if(!n) return 0;
ans = n;
if(!(n % 2))
{
while(!(n % 2)) n /= 2;
ans /= 2;
}
for(lol i = 3;i * i<=n;i += 2)
{
if(!(n % i))
{
while(!(n % i)) n /= i;
ans = ans / i * (i - 1);
}
}
if(n > 1) ans = ans / n * (n - 1);
printf("%lld\n",ans);
}
return 0;
}