Light OJ 1007 - Mathematically Hard

来源:互联网 发布:win10优化设置教程 编辑:程序博客网 时间:2024/05/31 19:08

题目:http://www.lightoj.com/volume_showproblem.php?problem=1007

这题首先要用筛选法将欧拉函数值打出来。然后还要注意的一点是 本题数据量较大(达到了10^20)

#include <stdio.h>#include <iostream>#include <string>#include <string.h>#include <algorithm>#include <stdlib.h>#include <math.h>#include <vector>#include <map>using namespace std;typedef unsigned long long ll;const int maxn = 5000001;ll eular[maxn];void get_eular(){//  打印欧拉函数的值    for(int i = 1;i < maxn;i++)        eular[i] = i;    for(int i = 2;i < maxn;i++){        if(eular[i] == i){            for(int j = i;j < maxn;j += i){                eular[j] = eular[j]/i*(i-1);            }        }    }//    for(int i = 1;i < 100;i++)//        printf("%d %d\n",i,eular[i]);}void init(){//做预处理,求1 ~ x 的 score (x)(score (x) = eular[x]*eular[x]) 的和。    ll temp = 0;    for(int i = 1;i < maxn;i++){        temp += eular[i]*eular[i];        eular[i] = temp;    }}int main(){    get_eular();    init();    int t;    scanf("%d",&t);    for(int cas = 1;cas <= t;cas++){        int a,b;        scanf("%d%d",&a,&b);        printf("Case %d: %llu\n",cas,eular[b] - eular[a-1]);    }    return 0;}

应该用 unsigned long long 才能存下。

0 0