light oj 1007 Mathematically Hard (欧拉函数)

题目地址:light oj 1007
第一发欧拉函数。
欧拉函数重要性质:
设a为N的质因数。若(N % a == 0 && (N / a) % a == 0) 则有E(N)=E(N / a) * a;若(N % a == 0 && (N / a) % a != 0) 则有:E(N) = E(N / a) * (a - 1)
对于这题来说。首先卡MLE。。

仅仅能开一个数组。。所以把前缀和也存到欧拉数组里。

然后卡long long。

。要用unsigned long long 。


代码例如以下:

#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <set>
#include <stdio.h>
#include <time.h>
using namespace std;
#define LL long long
#define pi acos(-1.0)
#pragma comment(linker, "/STACK:1024000000")
const int mod=9901;
const int INF=0x3f3f3f3f;
const double eqs=1e-9;
const int MAXN=5000000+10;
unsigned LL euler[MAXN];
void init()
{
        int i, j, max1=5000000;
        for(i=2;i<=max1;i++){
                euler[i]=i;
        }
        for(i=2;i<=max1;i++){
                if(euler[i]!=i) continue ;
                for(j=i;j<=max1;j+=i){
                        euler[j]=euler[j]/i*(i-1);
                }
        }
        for(i=2;i<=max1;i++){
                euler[i]=euler[i-1]+euler[i]*euler[i];
        }
}
int main()
{
        int t, l, r, icase=0;
        scanf("%d",&t);
        init();
        while(t--){
                scanf("%d%d",&l,&r);
                printf("Case %d: %llu\n",++icase,euler[r]-euler[l-1]);
        }
        return 0;
}

posted @ 2018-04-24 11:16  zhchoutai  阅读(129)  评论(0编辑  收藏  举报