题意:给出两个数a,b;就算a到b之间各数的欧拉数之和;比如a=3,b=5那么结果应该为8;
#include <iostream>
#include <stdio.h>
using namespace std;
#define maxn 3000010
int m[maxn],phi[maxn],p[maxn],pt;//m[i]是i的最小素因数,p是素数,pt是素数个数
void make()//打表计算2--3000010各数的欧拉函数值;
{
phi[1]=1;
int N=maxn;
int k;
for(int i=2;i<N;i++)
{
if(!m[i])//i是素数
p[pt++]=m[i]=i,phi[i]=i-1;
for(int j=0;j<pt&&(k=p[j]*i)<N;j++)
{
m[k]=p[j];
if(m[i]==p[j])//为了保证以后的数不被再筛,要break
{
phi[k]=phi[i]*p[j];
/*这里的phi[k]与phi[i]后面的∏(p[i]-1)/p[i]都一样(m[i]==p[j])只差一个p[j],就可以保证∏(p[i]-1)/p[i]前面也一样了*/
break;
}
else
phi[k]=phi[i]*(p[j]-1);//积性函数性质,f(i*k)=f(i)*f(k)
}
}
}///计算欧拉数的一个区间模板;
int main()
{
__int64 count;
int i,j;
make();
while(cin>>i>>j)
{
x=0;
for(int k=i;k<=j;k++) <pre name="code" class="cpp"> count+=phi[k];//求给出的两个数之间各数的欧拉函数之和;
printf("%I64d\n",count); } return 0;}