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
Recommend
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
线性筛求欧拉函数~
用到的性质是:
(1)当p是质数时,φ(p)=p-1;
(2)如果i%p==0,那么φ(i*p)=p*φ(i).
然后,输入是多组数据……
#include<cstdio>
int x,y,a[3000001],phi[3000001];
long long tot;
bool b[3000001];
void findd(int u)
{
phi[1]=1;
for(int i=2;i<=u;i++)
{
if(!b[i])
{
a[++a[0]]=i;phi[i]=i-1;
}
for(int j=1;j<=a[0];j++)
{
if(a[j]*i>u) break;
b[a[j]*i]=1;
if(i%a[j]==0)
{
phi[a[j]*i]=phi[i]*a[j];break;
}
phi[a[j]*i]=phi[i]*(a[j]-1);
}
}
}
int main()
{
findd(3000000);
while(scanf("%d%d",&x,&y)==2)
{
tot=0;
for(int i=x;i<=y;i++) tot+=(long long)phi[i];
printf("%lld\n",tot);
}
return 0;
}