AcWing 874. 筛法求欧拉函数

AcWing 874. 筛法求欧拉函数

一、题目描述

给定一个正整数 n,求 1n 中每个数的欧拉函数之和。

输入格式
共一行,包含一个整数 n

输出格式
共一行,包含一个整数,表示 1n 中每个数的欧拉函数之和。

数据范围
1n106

输入样例:

6

输出样例:

12

二、线性筛法求欧拉函数

依托于线性筛法,可以顺带求出欧拉函数值。

(1) phi[1]=1,φ(1)定义1

对区间内每个数进行分情况讨论:

(2) 质数

质数i的欧拉函数值phi[i]=i1
比如7,那么16当中有多少个数与7互质呢?显然6个都是嘛。

(3) 非质数

数字i在被primes[j]尝试筛的过程中:
(设 pj=primes[j],简便下面的书写)

如果i % pj=0, 那么 phi[ipj]=phi[i]pj

证明
i=p1α1p2α2p3α3...pjαj...pkαk 【算术基本定理】

phi[i]=i(11p1)(11p2)(11p3)...(11pj) 【欧拉公式】

pji分解质数因数的结果,只比i多分解了一个pj,而 i % pj=0 说明i中存在pj因子,只不过指数增加了1个。

pji=p1α1p2α2p3α3...pjαj+1...pkαk
通过瞪眼大法观察欧拉公式可知,欧拉公式只与质数因子相关,而与质数因子的幂次无关! 二者的质数因子没有变化,变化的只是某个质数因子的幂次。所以:
phi[pji]=pji(11p1)(11p2)(11p3)...(11pj)=phi[i]pj

证毕

如果i % pj>0, 那么 phi[ipj]=phi[i](pj1)
证明:
i=p1α1p2α2p3α3...pkαk 【算术基本定理】
phi[i]=i(11p1)(11p2)(11p3)...(11pk)【欧拉公式】

pji分解质数因数的结果,只是比i多分解了一个pj,而 i % pj>0 说明i中不存在pj这个因子,需要写上去。

pji=p1α1p2α2p3α3...pkαkpj1

phi[pji]=pji(11p1)(11p2)(11p3)...(11pk)(11pj)

phi[pji]=pjphi[i](11pj)=phi[i](pj1)

证毕

三、实现代码

#include <bits/stdc++.h>

using namespace std;

#define int long long
const int N = 1e6 + 10;
int primes[N];
int cnt;
int phi[N];
int st[N];
int res;

void get_eulers(int n) {
    phi[1] = 1;
    for (int i = 2; i <= n; i++) {
        if (!st[i]) {
            primes[cnt++] = i;
            phi[i] = i - 1; // ①质数
        }
        for (int j = 0; primes[j] <= n / i; j++) {
            int t = primes[j] * i;
            st[t] = 1;
            if (i % primes[j] == 0) {
                phi[t] = phi[i] * primes[j]; // ② i%pj==0
                break;
            } else
                phi[t] = phi[i] * (primes[j] - 1); // ③i%pj>0
        }
    }
}

signed main() {
    int n;
    cin >> n;

    get_eulers(n);

    for (int i = 1; i <= n; i++) res += phi[i];

    printf("%lld\n", res);
}
posted @   糖豆爸爸  阅读(103)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2022-03-24 AcWing 1146. 新的开始
2022-03-24 AcWing 1144. 连接格点
2022-03-24 AcWing 1143. 联络员
Live2D
点击右上角即可分享
微信分享提示