欧拉函数
给出一个n求出与n公约数大于1的数的和。
对于一个a与n互质, 那么n-a与a也互质。不存在a与n互质,n-a=a的情况。
也就是说a 和n-a总是成对存在 那么phi[n]是偶数。那么和n互质数的和就是 n*phi[n]/2
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=100005;
const int mod=1000000007;
int prime[maxn],len=0;
bool vis[maxn];
void makepri()
{
len=0;
for(int i=2;i<maxn;i++)
{
if(!vis[i]) prime[len++]=i;
for(int j=0;i<len&&i*prime[j]<maxn;j++)
{
vis[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
}
}
int main()
{
makepri();
int n;
while(scanf("%d",&n),n)
{
ll ans=n,t=n;
for(int i=0;i<len&&prime[i]<=n;i++)
{
if(n%prime[i]==0)
{
ans=ans/prime[i]*(prime[i]-1);
while(n%prime[i]==0) n/=prime[i];
}
//printf("->%d\n",ans);
}
if(n>1) ans=ans/n*(n-1);
//printf("->%d\n",ans);
ll temp=(t*(t-1)-ans*t)/2;
printf("%I64d\n",temp%mod);
}
return 0;
}