首页 > 其他分享 >AcWing 874. 筛法求欧拉函数

AcWing 874. 筛法求欧拉函数

时间:2023-03-24 10:11:33浏览次数:47  
标签:... phi frac 筛法 int 874 alpha 欧拉 AcWing

\(AcWing\) \(874.\) 筛法求欧拉函数

一、题目描述

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

输入格式
共一行,包含一个整数 \(n\)。

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

数据范围
\(1≤n≤10^6\)

输入样例:

6

输出样例:

12

二、线性筛法求欧拉函数

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

(\(1\)) \(phi[1]=1\),\(φ(1)\)被 定义 为\(1\)

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

(\(2\)) 质数

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

(\(3\)) 非质数

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

如果\(i\ \% \ p_j = 0\), 那么 \(phi[i * p_j] = phi[i] * p_j\)

证明
\(\because\) \(i={p_1}^{\alpha_1} * {p_2}^{\alpha_2} * {p_3}^{\alpha_3} * ... *{p_j}^{\alpha_j}*...*{p_k}^{\alpha_k}\) 【算术基本定理】

$phi[i]= i * (1- \frac{1}{p_1}) * (1- \frac{1}{p_2}) * (1- \frac{1}{p_3}) * ... * (1- \frac{1}{p_j}) $ 【欧拉公式】

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

\(\therefore\) \(p_j * i ={p_1}^{\alpha_1} * {p_2}^{\alpha_2} * {p_3}^{\alpha_3} * ... *{p_j}^{\alpha_j+1}*...*{p_k}^{\alpha_k}\)
通过瞪眼大法观察欧拉公式可知,欧拉公式只与质数因子相关,而与质数因子的幂次无关! 二者的质数因子没有变化,变化的只是某个质数因子的幂次。所以:
$phi[p_j * i] =p_j * i * (1- \frac{1}{p_1}) * (1- \frac{1}{p_2}) * (1- \frac{1}{p_3}) * ... * (1- \frac{1}{p_j}) = phi[i] * p_j $

证毕

如果\(i\ \% \ p_j > 0\), 那么 \(phi[i * p_j] = phi[i] * (p_j-1)\)
证明:
\(\because\) $i={p_1}^{\alpha_1} * {p_2}^{\alpha_2} * {p_3}^{\alpha_3} * ... *{p_k}^{\alpha_k} $ 【算术基本定理】
\(phi[i]= i * (1- \frac{1}{p_1}) * (1- \frac{1}{p_2}) * (1- \frac{1}{p_3}) * ... * (1- \frac{1}{p_k})\)【欧拉公式】

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

$p_j * i ={p_1}^{\alpha_1} * {p_2}^{\alpha_2} * {p_3}^{\alpha_3} * ... * {p_k}^{\alpha_k} * {p_j}^{1} $

$\therefore phi[p_j * i]= p_j * i * (1- \frac{1}{p_1}) * (1- \frac{1}{p_2}) * (1- \frac{1}{p_3}) * ... * (1- \frac{1}{p_k}) * (1- \frac{1}{p_j}) $

$\therefore phi[p_j * i]= p_j * phi[i] * (1 - \frac{1}{p_j}) = phi[i] * ( p_j -1) $

证毕

三、实现代码

#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);
}

标签:...,phi,frac,筛法,int,874,alpha,欧拉,AcWing
From: https://www.cnblogs.com/littlehb/p/17250461.html

相关文章

  • 数论基础1(质数判断,分解质因数,筛法,优化筛法,约数,约数个数,约数之和)
    模板://质数判定--试除法//朴素O(N)boolis_prime(intn){ if(n<2)returnfalse; for(inti=2;i<n;i++) { if(n%i==0)returnfalse; } returntrue;}//......
  • acwing532. 货币系统
    题目来源acwing题目难度3星算法标签完全背包+高等代数参考程序#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;constint......
  • 数学知识模板之筛法求素数
    筛法求素数1.朴素筛法求素数intprimes[N],cnt;boolst[N];voidget_primes(intn){ for(inti=2;i<=n;i++) { if(st[i])continue; primes[cnt++]=......
  • acwing算法基础课整理
    acwing算法基础课整理模板基础算法排序快速排序#include<iostream>usingnamespacestd;constintN=1e6+10;intq[N];intn;voidquick_sort(intq[],in......
  • acwing113. 特殊排序
    题目来源acwing题目难度2星算法标签二分参考程序//ForwarddeclarationofcompareAPI.//boolcompare(inta,intb);//returnboolmeanswhetheraisles......
  • Acwing 291. 蒙德里安的梦想
     状态压缩DP当把所有横向格子放完后,纵向方格的排放方案只有一种。因此整个划分方案数与横着摆放方格的方案数相同。f[i,j]表示,目前摆放第i列,j是二进制数(状态是整数,看......
  • 「AcWing学习记录」拓扑排序
    AcWing848.有向图的拓扑序列原题链接图的拓扑序列是针对有向图来说的,无向图是没有拓扑序列的。可以证明,有向无环图一定存在一个拓扑序列,所以有向无环图也被称为拓扑图......
  • 「AcWing学习记录」DFS
    AcWing842.排列数字原题链接#include<iostream>usingnamespacestd;constintN=10;intn;intpath[N];boolst[N];voiddfs(intu){if(u==n)......
  • AcWing100 -- 差分 & 贪心
    1.题目描述题目给定我们一个数组,我们每次可以对数组的一段区间加一或者减一,问我们,使得序列所有数字相等的最少操作次数以及方案个数2.思路很容易想到差分,将题目转......
  • AcWing3305 -- 建图
    1.题目描述给定我们一些初始作物,和作物之间杂交的规则(作物\(a\)和作物\(b\)杂交产生种子\(c\),花费作物\(a\)和作物\(b\)成熟时间的最大值),让我们求,某个作物\(T......