欧拉函数的定义: E(N)= ( 区间[1,N-1] 中与 N 互质的整数个数).
对于 积性函数 F(X*Y),当且仅当 GCD(X,Y)= 1 时, F(X*Y) = F(X)* F(Y)
任意整数可因式分解为如下形式:
其中( p1, p2 … pk 为质数, ei 为次数 )
所以
因为 欧拉函数 E(X)为积性函数, 所以
对于 , 我们知道 因为pi 为质数,所以 [ 1, pi-1 ] 区间的数都与 pi 互质
对于 区间[ 1, ] ,共有 个数, 因为 只有一个质因子,
所以与 约数大于1 的必定包含 质因子 , 其数量为
所以
又 E(N)为积性函数,所以可得 :
又因为 其中( p1, p2 … pk 为质数, ei 为次数 )
但是此计算公式,除法过多,所以计算速度较慢
在程序中利用欧拉函数如下性质,可以快速求出欧拉函数的值 ( P为N的质因子 )
若(N%P==0 && (N/P)%P==0) 则有:E(N)=E(N/P)*P;
若(N%P==0 && (N/P)%P!=0) 则有:E(N)=E(N/P)*(P-1);
//求[a, b]中 素数的个数
int prime[500];
int vis[500];
int phi[500];
void Prime(int n)
{
int cnt = 0;
memset(vis, 0, sizeof(vis));
for (int i = 2; i<n; i++)
{
if (!vis[i])
{
prime[cnt++] = i;
phi[i] = i - 1;
}
for (int j = 0; j<cnt&&i*prime[j]<n; j++)
{
__int64 k = i*prime[j];
vis[k] = 1;
if (i%prime[j] == 0)
{
phi[k] = phi[i] * prime[j];
break;
}
else
phi[k] = phi[i] * (prime[j] - 1);
}
}
}
int main (void)
{
int a, b;
while(scanf("%d %d", &a, &b) != EOF)
{
int ans = 0;
for(int i = a; i <= b; i++)
{
ans += phi[i];
}
printf("%d\n", ans);
}
return 0;
}
时间: 2024-10-10 04:38:42