Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1111 Accepted Submission(s): 466
3 100
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; }