题目大意:定义score(i)为其欧拉函数的平方,现在问你区间[a,b]所有的score的值总和为多少;
题目解析:首先我们要快速筛出所有数的欧拉函数,然后用前缀和计算,这样就不会超时,注意一定要unsigned long long;
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=5000005;
unsigned long long frs[maxn];
void init()
{
frs[1]=0;
for(int i=2;i<maxn;i++)
{
if(!frs[i])
{
for(int j=i;j<maxn;j+=i)
{
if(!frs[j])
{
frs[j]=j;
}
frs[j]=frs[j]/i*(i-1);
}
}
}
for(int i=2;i<maxn;i++)
{
frs[i]=frs[i-1]+frs[i]*frs[i];
}
}
int main()
{
init();
int i,a,b,cas,c;
cin>>cas;
for(c=1;c<=cas;c++)
{
scanf("%d%d",&a,&b);
printf("Case %d: %llu\n",c,frs[b]-frs[a-1]);
}
return 0;
}