The Euler function(欧拉函数预处理+素数筛+一维数组前缀和)

Problem Description

The Euler function phi is an important kind of function in number theory, (n) represents the amount of the numbers which are smaller than n and coprime to n, and this function has a lot of beautiful characteristics. Here comes a very easy question: suppose you are given a, b, try to calculate (a)+ (a+1)+....+ (b)

Input

There are several test cases. Each line has two integers a, b (2<a<b<3000000).

Output

Output the result of (a)+ (a+1)+....+ (b)

Sample Input


3 100

Sample Output

3042

思路:

先用欧拉预处理和素数筛得到3000000以内每个数的欧拉函数,然后用前缀和算法对eula进行求前缀和的操作。

欧拉函数定义:给定一个数,满足gcd(i,n)==1(1<=i<=n)的个数。

AC代码如下:

#include<iostream>
using namespace std;
#define MAX 3000005
#define ll long long
bool isPrime[MAX];
ll eula[MAX];
void eulaPrime() {
	int i, j;
	isPrime[1] = 1;
	for (i = 1; i < MAX; i++) {
		eula[i] = i;
	}
	for (i = 2; i < MAX; i++) {
		if (!isPrime[i]) {
			eula[i] = i - 1;
			for (j = i + i; j < MAX; j += i) {
				isPrime[j] = 1;
				eula[j] /= i;
				eula[j] *= (i - 1);
			}
		}
	}
}
int main() {
	eulaPrime();
	int a, b;
	for (int i = 1; i < MAX; i++) {
		eula[i] += eula[i - 1];
	}
	while (cin >> a >> b) {
		cout << eula[b] - eula[a - 1] << endl;
	}
	return 0;
}

上一篇:Go的模块管理Mod


下一篇:纳米猫猫(欧拉函数)