hdu 3501 Calculation 2(稍优化点的欧拉函数)
最开始我学的欧拉函数,模拟方程式需要O(n)的时间复杂度。做这题,我发现了我们只需要知道质因子,既然是因子那么一定是小于等于sqrt(n),那么我们复杂度下降到O(sqrt(n))。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <queue>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define MOD 1000000007
#define N 100010
LL euler(LL n)
{
LL cnt = n;
for(int i = 2; i*i <= n; i++)
{
if(n%i == 0)
{
cnt -= cnt/i;
while(n%i == 0)
n/=i;
}
}
if(n > 1)
cnt -= cnt/n;
return cnt;
}
int main()
{
LL n;
while(~scanf("%lld",&n),n)
{
LL ans = n*(n+1)/2-n;
ans -= (LL)euler(n)*n/2;
printf("%lld\n",ans%MOD);
}
return 0;
}