LightOJ1007 Mathematically Hard

来源:互联网 发布:中国人民大学新闻 知乎 编辑:程序博客网 时间:2024/04/29 19:08

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);    }}
0 0
原创粉丝点击