HDU 2824 The Euler function (欧拉函数-快速打表)

来源:互联网 发布:中餐点菜软件 编辑:程序博客网 时间:2024/06/05 07:53

先打表

这个打表的方式很快,跟大佬学的,利用了求欧拉函数的几条性质


1. 对于phi [ a ]  如果a是质数,则 phi [ a ]  =  a - 1;

(下面这条更新一下:(虽然代码中又体现 但是这里不够清楚))

2.  对于 n 是 质数时:

    当 m % n != 0 时: phi [ m * n ] = phi [ m ] * phi [ n ] ;

    当 m % n == 0 时:phi [ m * n ] = phi [ m ] *  n  ;


#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <string>#include <cmath>#include <set>#include <map>#include <stack>#include <queue>#include <ctype.h>#include <vector>#include <algorithm>#include <sstream>#define PI acos(-1.0)#define in freopen("in.txt", "r", stdin)#define out freopen("out.txt", "w", stdout)using namespace std;typedef long long ll;const int maxn = 3000000 + 7, INF = 0x3f3f3f3f, mod = 1e9 + 7;int a, b;int phi[maxn], prim[maxn];void get_ouler(int n) {    memset(phi, 0, sizeof phi);    phi[1] = 1;    int id = 0;    for(int i = 2; i < n; ++i) {        if(!phi[i]) { phi[i] = i - 1; prim[id++] = i; }        for(int j = 0; j < id && prim[j]*i < maxn; ++j) {            if(i % prim[j]) { phi[i*prim[j]] = phi[i] * (prim[j]-1); }            else {                phi[i*prim[j]] = phi[i] * prim[j];                break;            }        }    }}int main() {    get_ouler(maxn);    while(scanf("%d %d", &a, &b) != EOF) {        ll ans = 0;        for(int i = a; i <= b; ++i)            ans += (ll)phi[i];        cout << ans << endl;    }    return 0;}