快速求出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 }
时间: 2024-12-08 10:12:37