如果 大家 看完之后 还是 不太懂 的话 ,可以先把代码 记住 以后 会慢慢理解的 。
这个 欧拉函数 打表 还是 挺有用的
至于 欧拉函数 值的 计算 完全可以 用 线性筛法 用一个 变量 计数 即可 求出 。 素数筛法 有好几个 而 线性筛法 为 时间复杂度 最低 的 也是 有前面两种 筛法 优化而来。
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
#define bint __int64
#define N 3000001
bint phi[N];
void init()
{
int i, j;
for(int i = 1; i < N; i++)
phi[i] = i;
for(i = 2; i < N; i++)
if(i == phi[i])// 此时 i 为 素数
for(j = i; j < N; j += i)
phi[j] = (phi[j]/i) * (i - 1);// 欧拉函数 的 计算
}
int main()
{
init();
int a, b;
while(scanf("%d%d", &a, &b) != EOF)
{
bint ans = 0;
for(int i = a; i <= b; i++)
ans += phi[i];
printf("%I64d\n", ans);
}
return 0;
}