题意:求[a,b]范围内所有整数的欧拉函数的平方和。欧拉函数:求不大于其本身的与其互质的数的个数。
题解:预处理,欧拉函数筛选下,之后保存前n项和,sum[n]。答案就是ans=sum[b]-sum[a-1]。
注意:
1.之后结果很大,需要用无符号64位整数,unsigned long long。lightoj好像不能用__int64。
2.内存足,开两个5e6的数组会爆内存,所以前n项和以及欧拉函数共用一个数组。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL unsigned long long
const int maxn=5e6+10;
LL phi[maxn];
void phi_table()
{
int i,j;
for(i=2;i<=5e6;i++)phi[i]=0;
phi[1]=1;
for(i=2;i<=5e6;i++)if(!phi[i])
for(j=i;j<=5e6;j+=i)
{
if(!phi[j])phi[j]=j;
phi[j]=phi[j]/i*(i-1);
}
phi[0]=0;
for(i=1;i<=5e6;i++)
phi[i]=phi[i]*phi[i]+phi[i-1];
}
int main()
{
phi_table();
int T,tt=0;
scanf("%d",&T);
while(T--)
{
int a,b;
scanf("%d%d",&a,&b);
printf("Case %d: %llu\n",++tt,phi[b]-phi[a-1]);
}
return 0;
}