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;
}