快速求出a到b之间所有数的欧拉函数。
一个一个求肯定是不行的, 我们知道欧拉函数的公式为phi(n) = n*(1-1/i1)*(1-1/i2).......i1, i2为素因子。 那么我们就可以先将每一个数的欧拉函数值预处理出来。
具体看代码
#include<bits/stdc++.h>
using namespace std;
#define pb(x) push_back(x)
#define ll long long
#define mk(x, y) make_pair(x, y)
#define lson l, m, rt<<1
#define mem(a) memset(a, 0, sizeof(a))
#define rson m+1, r, rt<<1|1
#define mem1(a) memset(a, -1, sizeof(a))
#define mem2(a) memset(a, 0x3f, sizeof(a))
#define rep(i, a, n) for(int i = a; i<n; i++)
#define ull unsigned long long
typedef pair<int, int> pll;
const double PI = acos(-1.0);
const double eps = 1e-;
const int mod = 1e9+;
const int inf = ;
const int dir[][] = { {-, }, {, }, {, -}, {, } };
const int maxn = 3e6+;;
int f[maxn];
int main()
{
int t, n, m, cnt;
for(int i = ; i<=maxn; i++) {
f[i] = i;
}
for(int i = ; i<maxn; i++) {
if(f[i] == i) { //如果f[i] == i, 说明这个数是素数
for(int j = i; j<maxn; j+=i) {
f[j] = f[j]/i*(i-); //f[j]*(1-1/i)
}
}
}
while(~scanf("%d%d", &n, &m)) {
ll sum = ;
for(int i = n; i<=m; i++) {
sum += f[i];
}
cout<<sum<<endl;
}
}