Mathematically Hard 欧拉函数

题目大意:

求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;
}

猜你喜欢

转载自blog.csdn.net/qq_41049928/article/details/83067943