Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1111????Accepted Submission(s): 466
?
Input There are several test cases. Each line has two integers a, b (2<a<b<3000000).?
Sample Input3 100Sample Output
3042
?????????题目大意:输入a和b,求a~b直接的欧拉值,要用到筛法欧拉函数,直接欧拉函数会超时,数据很大,不多说。
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2824
代码:
#include <iostream> #include <stdio.h> #include <memory.h> #include <math.h> using namespace std; const int N = 3000005; int prime[N]; int phi[N]; bool is_prime[N]; void get_phi() { int i, j, k; k = 0; for(i = 2; i < N; i++) { if(is_prime[i] == false) { prime[k++] = i; phi[i] = i-1; } for(j = 0; j<k && i*prime[j]<N; j++) { is_prime[ i*prime[j] ] = true; if(i%prime[j] == 0) { phi[ i*prime[j] ] = phi[i] * prime[j]; break; } else { phi[ i*prime[j] ] = phi[i] * (prime[j]-1); } } } } int main() { long long sum; int i, x, y; get_phi(); while(scanf("%d %d", &x, &y) != EOF) { sum = 0; for(i = x; i <= y; i++) { sum += phi[i]; } printf("%I64d\n", sum); } return 0; }