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(欧拉定理+前缀和)