您的位置:首页 > 其它

HDU 2824 The Euler function (欧拉函数打表)

2017-03-06 21:45 501 查看


The Euler function

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 6361    Accepted Submission(s): 2671


Problem Description

The Euler function phi is an important kind of function in number theory, (n) represents the amount of the numbers which are smaller than n and coprime to n, and this function has a lot of beautiful characteristics. Here comes a very easy question: suppose
you are given a, b, try to calculate (a)+ (a+1)+....+ (b)

 

Input

There are several test cases. Each line has two integers a, b (2<a<b<3000000).

 

Output

Output the result of (a)+ (a+1)+....+ (b)

 

Sample Input

3 100

 

Sample Output

3042

 

Source

2009 Multi-University Training Contest 1 - Host
by TJU

 

Recommend

gaojie   |   We have carefully selected several similar problems for you:  2818 2825 2817 2822 2821 

不能直接利用欧拉函数公式计算,会TLE,利用欧拉函数的性质

if(N%a==0&&(N/a)%a==0)则E(N)=E(N/a)*a;

else E[N)=E(N/a)*(a-1);

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define INF 3000005
int tar[INF],phi[INF];
bool pri[INF];
void prime()
{
int i,j,cot=0;
for(i=2;i<INF;i++)
{
if(pri[i]==false)
{
tar[cot++]=i;
phi[i]=i-1;
}
for(j=0;j<cot&&i*tar[j]<INF;j++)
{
pri[i*tar[j]]=true;
if(i%tar[j]==0)
phi[i*tar[j]]=phi[i]*tar[j];
else
phi[i*tar[j]]=phi[i]*(tar[j]-1);
}
}
}
int main()
{
int i,j,a,b;
__int64 sum;
prime();
while(scanf("%d%d",&a,&b)!=EOF)
{
sum=0;
for(i=a;i<=b;i++)
sum+=phi[i];
printf("%I64d\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: