hdu 2824The Euler function

题目链接

快速求出a到b之间所有数的欧拉函数。

一个一个求肯定是不行的, 我们知道欧拉函数的公式为phi(n) = n*(1-1/i1)*(1-1/i2).......i1, i2为素因子。 那么我们就可以先将每一个数的欧拉函数值预处理出来。

具体看代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define pb(x) push_back(x)
 4 #define ll long long
 5 #define mk(x, y) make_pair(x, y)
 6 #define lson l, m, rt<<1
 7 #define mem(a) memset(a, 0, sizeof(a))
 8 #define rson m+1, r, rt<<1|1
 9 #define mem1(a) memset(a, -1, sizeof(a))
10 #define mem2(a) memset(a, 0x3f, sizeof(a))
11 #define rep(i, a, n) for(int i = a; i<n; i++)
12 #define ull unsigned long long
13 typedef pair<int, int> pll;
14 const double PI = acos(-1.0);
15 const double eps = 1e-8;
16 const int mod = 1e9+7;
17 const int inf = 1061109567;
18 const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
19 const int maxn = 3e6+6;;
20 int f[maxn];
21 int main()
22 {
23     int t, n, m, cnt;
24     for(int i = 2; i<=maxn; i++) {
25         f[i] = i;
26     }
27     for(int i = 2; i<maxn; i++) {
28         if(f[i] == i) {             //如果f[i] == i, 说明这个数是素数
29             for(int j = i; j<maxn; j+=i) {
30                 f[j] = f[j]/i*(i-1);            //f[j]*(1-1/i)
31             }
32         }
33     }
34     while(~scanf("%d%d", &n, &m)) {
35         ll sum = 0;
36         for(int i = n; i<=m; i++) {
37             sum += f[i];
38         }
39         cout<<sum<<endl;
40     }
41 }
原文地址:https://www.cnblogs.com/yohaha/p/5045131.html