ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

筛法求欧拉函数之和

2022-07-24 00:33:57  阅读:144  来源: 互联网

标签:phi frac 函数 筛法 int 质数 varphi times 欧拉


题目描述

求\(1\sim n\)每个数欧拉函数之和

想法

  1. 如果\(i\)是质数
    \(\varphi (i) = i - 1\)

质数\(i\)只有\(1\)和\(i\)两个因数,\(i\)不和\(i\)本身互质,因数只有一个\(1\),所以互质的数就有\(i-1\)个

  1. 如果\(i\)不是质数
  1. \(i \% j = 0\)
    \(j\)是质数
    则\(j\)即\(i\)的一个质因子,所以\(\varphi (i)\)中已经包含了\(j\)

\(\varphi (j \times i) = j\times i\times (1-\frac{1}{p_1})\times(1-\frac{1}{p_2})\times…\times(1-\frac{1}{p_k}))\)①
因为$\varphi (i) =i\times (1-\frac{1}{p_1})\times(1-\frac{1}{p_2})\times…\times(1-\frac{1}{p_k}) \(② 将②代入①中得: \)\varphi (j \times i) = j \times \varphi (i)$

  1. \(i \% j \neq 0\)
    则\(j\)不是\(i\)的质因子,根据线性筛中的推导,\(j\)是\(j \times i\)的最小质因子

所以\(\varphi(j\times i)=\varphi (i) \times \varphi (j)\)
由1可得,如果\(j\)是质数:\(\varphi (j) = j - 1\)
\(\varphi(j\times i)= \varphi (i) \times (j - 1)\)

发现过程中有关质因数,想到线性筛
所以我们可以套用线性筛的板子

码来!

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e6+10;

typedef long long LL;

int primes[N], idx; // 记录质数,idx是下标
int phi[N]; // 存储每个欧拉函数的值
bool st[N]; // 是否是质数

LL get_phi(int n)
{
    phi[1] = 1;
    
    for (int i = 2; i <= n; i ++ )
    {
        if(!st[i]) // 如果i是质数
        {
            primes[idx++] = i;
            phi[i] = i - 1;
        }

        for (int j = 0; primes[j] <= n / i; j ++ )
        {
            int t = primes[j] * i;

            st[t] = true;

            if(i % primes[j] == 0) // j是i的质因数的情况
            {
                phi[t] = phi[i] * primes[j];
                break;
            }
            // j不是i的质因数的情况
            phi[t] = phi[i] * (primes[j] - 1);
        }
    }
    
    LL res = 0; // 用longlong类型存储 —— 怕爆int

    for(int i = 1; i <= n; i++)
    {
        res += phi[i]; // 计算从1到n的欧拉函数之和
    }
    
    return res;
}

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

    LL ans = get_phi(n);

    printf("%lld\n", ans);
    
    return 0;
}

欢迎大佬指出本蒟蒻的错误!

标签:phi,frac,函数,筛法,int,质数,varphi,times,欧拉
来源: https://www.cnblogs.com/MoyouSayuki/p/16513675.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有