線性篩莫比烏斯函數&歐拉函數(模板)

bool vis[Maxn];
int mu[Maxn], prim[Maxn];

void Mobius() {
    mu[1] = 1;
    int tot = 0;
    for (int i = 2; i <= Maxn; i ++) {
        if(!vis[i]) {
            prim[tot ++] = i;
            mu[i] = -1;
        }
        for (int j = 0; j < tot; j ++){
            if(i * prim[j] > Maxn) break;
            vis[i * prim[j]] = true;
            if(i % prim[j] == 0) {
                mu[i * prim[j]] = 0;
                break;
            }
            mu[i * prim[j]] = - mu[i];
        }
    }
}

線性篩 歐拉函數

void init() {
    phi[1] = 1;
    for(LL i = 2; i <= M; i ++) {
        if(!mark[i]) {
            prim[++tot] = i;
            phi[i] = i - 1;
        }
        for (LL j = 1; j <= tot; j ++) {
            if(i * prim[j] > M) break;
            mark[i * prim[j]] = 1;
            if(i % prim[j] == 0) {
                phi[i * prim[j]] = phi[i] * prim[j];
                break;
            }
            phi[i *prim[j]] = phi[i] * phi[prim[j]];
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章