题目大意:
求a~b之间的欧拉函数的平方的和;
解题思路:
其实如果你知道欧拉函数的话这道题的解题思路就比较简单了,但是由于数据比较大,所以应该用unsigned long long 类型的数据来保存。
欧拉函数:
小于n的数中与n互质的数的数目。
所以利用公式,对于质数,对他的倍数(从这个质数本身开始更新)×(n-1)/n(初始值为这个数本身)
代码过程很好理解。
#include <iostream>
#include<stdio.h>
#define ll unsigned long long
using namespace std;
ll ans[5000005];
void check()
{
ans[1]=1;
for(int i=2; i<5000005; i++)
{
if(!ans[i])
{
for(int j=i; j<5000005; j+=i)
{
if(!ans[j])
ans[j]=j;
ans[j]=ans[j]/i*(i-1);
}
}
}
for(int i=1; i<5000005; i++)
ans[i]=ans[i-1]+ans[i]*ans[i];
}
int main()
{
check();
int n,a,b;
scanf("%d",&n);
int top=0;
while(n--)
{
scanf("%d%d",&a,&b);
printf("Case %d: %llu\n",++top,ans[b]-ans[a-1]);
}
return 0;
}