LightOJ1007 Mathematically Hard

Posted legend_PawN

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LightOJ1007 Mathematically Hard相关的知识,希望对你有一定的参考价值。

LightOJ1007
题目的意思很容易理解,求一个区间[a,b]内的欧拉函数平方之和
但是题目的数据限很大 a,b都是1e12级。按照一般思路写好程序后,实验以下从2到10000发现long long也会超范围,所以用unsigned long long。
此外还需要预处理前缀和,不然就会超时。
预处理前缀和时不能够再开数组,不然就会爆内存,WA点多多.
AC代码:

#include <bits/stdc++.h>
typedef unsigned long long ull;
const int maxn=5000000+10;
using namespace std;
ull euler[maxn],a,b;
void geteuler_table()          //欧拉函数打表
    memset(euler,0,sizeof(euler));
    euler[1]=0;
    for(int i=2;i<=maxn;i++)
            if(euler[i]==0)
            for(int j=i;j<=maxn;j+=i)
                if(euler[j]==0)
                    euler[j]=j;
                euler[j]=euler[j]/i*(i-1);
            
    
    //cout<<euler[2]<<endl;
    for(int i=2;i<=maxn;i++)        //预处理前缀和
        euler[i]=euler[i-1]+euler[i]*euler[i];

int main()
    //freopen("input.txt","r",stdin);
    int T,cnt=0;
    scanf("%d",&T);
    geteuler_table();
    while(T--)
        ull ans;
        scanf("%lld%lld",&a,&b);
        printf("Case %d: ",++cnt);
        ans=euler[b]-euler[a-1];
        printf("%llu\\n",ans);
    

以上是关于LightOJ1007 Mathematically Hard的主要内容,如果未能解决你的问题,请参考以下文章

LightOj1007 - Mathematically Hard(欧拉函数)

LightOJ1007 Mathematically Hard

Mathematically Hard LightOJ-1007(欧拉定理+前缀和)

LightOJ 1007 Mathematically Hard

lightoj 1234

(状压) Marriage Ceremonies (lightOJ 1011)