C++欧拉函数

题目一 求欧拉函数

图源ACWING

解题思路

  1. 分解质因数;
  2. 代入公式计算即可(注意要防止计算出小数是结果不准);

代码实现

#include<iostream>
#include<algorithm>
#include<cmath>

using namespace std;

void Euler(int n)
{
    int sq = sqrt(n);
    
    int t = n;    
    
    for(int i = 2;i <= sq;i ++ )//分解质因数;
    {
        if(n % i == 0)
        {
            t = t - t / i;// 不能用t = t * (1 - 1 / i),因为会计算出小数使结果不准;
            while(n % i == 0)
            {
                n /= i;
            }
        }
    }
    
    if(n > 1)
    {
        t = t - t / n;
    }
    
    cout << t << endl;
}

int main()
{
    int n, a;
    
    cin >> n;
    
    while(n -- )
    {
        scanf("%d", &a);
        Euler(a);
    }
    return 0;
}

题目二 线性筛法求欧拉函数

图源ACWING

解题思路

重要数学公式

  1. 欧拉函数 ϕ(N) ,如果N为质数,则ϕ(N) = N - 1(代入一般公式可得);
  2. ϕ(NM), 如果N,M互为质数,则ϕ(NM) = ϕ(N) * ϕ(M);

解题步骤

  1. 代入线性筛法求质数的模板;
  2. 根据条件,结合上述数学公式记录每个数的欧拉函数;
  3. 累加即可;

代码实现

#include<iostream>

using namespace std;

const int N = 1e6 + 10;

bool st[N];//判断是否被筛掉
int primes[N];//存质数
int prime_nums[N];//存储每个数的欧拉函数
int cnt;//存质数个数

void get_primes(int n)
{
    prime_nums[1] = 1;//1的欧拉函数为1(定义)
    
    for(int i = 2;i <= n;i ++ )
    {
        if(!st[i])
        {
            primes[cnt ++ ] = i;
            prime_nums[i] = i - 1;//质数的欧拉函数为其本身减一
        }
        
        for(int j = 0;primes[j] <= n / i;j ++ )
        {
            st[primes[j] * i] = true;
            
            if(i % primes[j] == 0)//primes[j]是i的最小质因数(下以pj代指primes[j])
            {
                prime_nums[primes[j] * i] = primes[j] * prime_nums[i];
                //pj是i最小质因数,若i分解质因数得p1^e1*^p2^e2^...pk^ek^;
                //则pj*i分解质因数等于p1^e1^*p2^e2^...pk^ek^(e1 ... ek某处+1),底数不变,指数某处+1;
                //代入欧拉公式等于pj*i*(1-1/p1)*(1-1/p2)...(1-1/pk) == pj*prime_nums[i];
                //也就是说pj等于p1,p2...pk中的一个数!!!
                break;
            }
            //pj和i互质:
            prime_nums[primes[j] * i] = prime_nums[i] * (primes[j] - 1);
            //pj不是i最小质因数,若i分解质因数得p1^e1^*p2^e2^...pk^ek^;
            //则pj*i分解质因数等于pj*p1^e1^*p2^e2^...pk^ek^;
            //代入欧拉公式等于pj*i*(1-1/pj)*(1-1/p1)*(1-1/p2)...(1-1/pk) == (pj-1)*prime_nums[i];
            //也就是说pj不等于p1,p2...pk中的任何一个数!!!
        }
    }
    
    long long res = 0;
    
    for(int i = 1;i <= n;i ++ )
    {
        res += prime_nums[i];
    }
    
    cout << res;
}

int main()
{
    int n;
    
    cin >> n;
    
    get_primes(n);
    
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/888628.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入剖析递归算法:原理、特点、应用与优化策略

在上一篇文章&#x1f449;【剖析十大经典二叉树题目】中&#xff0c;运用到了大量的递归算法&#xff0c;故本文将解析递归算法。 目录 &#x1f4af;引言 &#x1f4af;递归算法的定义与原理 ⭐定义 ⭐原理 &#x1f4af;递归算法的特点 ⭐简洁性 ⭐可读性 ⭐通用性 …

MKV转MP4丨FFmpeg的简单命令使用——视频格式转换

MKV是一种视频封装格式&#xff0c;很好用&#xff0c;也是OBS的默认推荐录制格式&#xff0c;因为不会突然断电关机而导致整个视频录制文件丢失。 但是MKV无法直接导入PR中剪辑&#xff0c;最直接的方法是将MKV转换为MP4格式&#xff0c;最方便且安全无损的转换方法便是用FFmp…

leetcode C++特性 AIDL的一些细节

leetcode细节 C的一些特性 【C基础】std::move用法介绍-CSDN博客 c thread的join和joinable的区别_thread joinable-CSDN博客 C线程介绍_std::thread 头文件-CSDN博客 https://blog.csdn.net/weixin_46645965/article/details/136259902 【C】—— 观察者模式-CSDN博客 C 迭…

(笔记)第三期书生·浦语大模型实战营(十一卷王场)–书生基础岛第3关---浦语提示词工程实践

学员闯关手册&#xff1a;https://aicarrier.feishu.cn/wiki/ZcgkwqteZi9s4ZkYr0Gcayg1n1g?open_in_browsertrue 课程视频&#xff1a;https://www.bilibili.com/video/BV1cU411S7iV/ 课程文档&#xff1a; https://github.com/InternLM/Tutorial/tree/camp3/docs/L1/Prompt 关…

Linux-分析 IO 瓶颈手册

分析IO瓶颈 此文主要内容&#xff1a;I/O性能重要指标、主要排查工具、主要排查手段、工具图示 磁盘 I/O 性能指标 四个核心的磁盘 I/O 指标 使用率&#xff1a;是指磁盘忙处理 I/O 请求的百分比。过高的使用率&#xff08;比如超过 60%&#xff09;通常意味着磁盘 I/O 存在…

办公AI推荐:阅读总结视频翻译文档文章等—包阅AI

目录 官网首页 网页阅读 思维导图 图书对话功能 1. 关键词 2. 总结 3. 主要内容 随心笔记 视频阅读 Mysql数据库案例 思维导图 内容评价 总结 想象一下&#xff0c;当您能在几分钟内掌握一小时视频的精华&#xff0c;或瞬间生成一本书的思维导图&#xff0c;您的学…

22.第二阶段x86游戏实战2-背包遍历REP指令详解

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

【AIGC】Exa AI 要做 AI 领域的 Google

又一个AI搜索引擎诞生&#xff1a;Exa AI。 与其他旨在取代谷歌的AI驱动搜索引擎不同&#xff0c;Exa的目标是创建一个专门为AI设计的搜索工具。 Exa的使命: 互联网包含人类的集体知识&#xff0c;但目前的搜索体验更像在垃圾场中导航&#xff0c;而非在知识图书馆中漫游。核…

SQL第14课挑战题

1. 将两个select语句结合起来&#xff0c;以便从OrderItems表中检索产品ID(prod_id)和quantity。其中&#xff0c;一个select语句过滤数量为100的行&#xff0c;另一个select语句过滤ID以BNBG开头的产品。按产品ID对结果进行排序。 2. 重新第一题&#xff0c;仅使用单个select语…

怎样查局域网里的所有ip?

如果想高效管理网络设备&#xff0c;识别配置、更新和维护各类连接设备&#xff0c;排查网络故障&#xff0c;提升网络安全性&#xff0c;监控异常 IP 活动&#xff0c;发现潜在威胁等需要知道局域网。那么怎样查局域网里的所有ip呢&#xff1f; 一、局域网IP是什么&#xff1…

【AI学习】Mamba学习(四):从SSM开始

Mamba的发展&#xff0c;是从SSM->HiPPO->S4->Mamba 演化过来。所以&#xff0c;了解Mamba&#xff0c;得从SSM开始。 SSM&#xff0c;状态空间模型 SSM&#xff0c;就是状态空间模型。 为什么需要SSM&#xff1f;查看三十年前的教科书&#xff0c;控制论的发展&…

重学SpringBoot3-集成Redis(五)之布隆过滤器

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;五&#xff09;之布隆过滤器 1. 什么是布隆过滤器&#xff1f;基本概念适用场景 2. 使用 Redis 实现布隆过滤器项目依赖Redis 配置…

netdata保姆级面板介绍

netdata保姆级面板介绍 基本介绍部署流程下载安装指令选择设置KSM为什么要启用 KSM&#xff1f;如何启用 KSM&#xff1f;验证 KSM 是否启用注意事项 检查端口启动状态 netdata和grafana的区别NetdataGrafananetdata各指标介绍总览system overview栏仪表盘1. CPU2. Load3. Disk…

NUKE 15有哪些新的改进功能?影视后期特效合成NUKE 15 安装包分享 【Mac/win】

Nuke 15是一款由英国The Foundry公司开发的专业的合成软件&#xff0c;被广泛用于电影、电视和广告制作中的后期合成和特效制作。 Nuke 15拥有强大的功能和灵活性&#xff0c;可以帮助用户处理各种复杂的合成任务&#xff0c;包括图像修复、色彩校正以及粒子特效等。它具备高效…

Spring Validation —— 参数校验框架

案例说明——后端校验注册表单字段 在编写注册功能时&#xff0c;需要考虑字段校验的情况&#xff0c;这时候可以采用 Spring提供的一套参数校验框架工具——Spring Validation。一下是使用的步骤&#xff1a; 1. 导入validation坐标 2. 在参数上添加 Pattern注解&#xff0c…

尚硅谷javaSpring

尚硅谷课件: 分类&#xff1a;尚硅谷Spring6教程 - Lixx Blog - 李晓旭的博客 简介 Java Spring 是一个开源的、全面的企业级应用开发框架&#xff0c;旨在简化企业级应用的开发。Spring 框架最初由 Rod Johnson 在 2002 年发布&#xff0c;并随着时间的推移&#xff0c;它已…

【源码+文档】基于Java的新能源停车场管理系统的设计与实现

&#x1f6a9;如何选题&#xff1f; 如何选题、让题目的难度在可控范围&#xff0c;以及如何在选题过程以及整个毕设过程中如何与老师沟通&#xff0c;这些问题是需要大家在选题前需要考虑的&#xff0c;具体的方法我会在文末详细为你解答。 &#x1f6ad;如何快速熟悉一个项…

低质量数据的多模态融合方法

目录 多模态融合 低质量多模态融合的核心挑战 噪声多模态数据学习 缺失模态插补 平衡多模态融合 动态多模态融合 启发式动态融合 基于注意力的动态融合 不确定性感知动态融合 论文 多模态融合 多模态融合侧重于整合多种模态的信息,以实现更准确的预测,在自动驾驶、…

【小沐学GIS】blender导入OpenTopography地形数据(BlenderGIS、OSM、Python)

文章目录 1、简介1.1 blender1.2 OpenStreetMap地图 2、BlenderGIS2.1 下载BlenderGIS2.2 安装BlenderGIS2.3 申请opentopography的key2.4 抓取卫星地图2.5 生成高度图2.6 获取OSM数据 结语 1、简介 1.1 blender https://www.blender.org/ Blender 是一款免费的开源 3D 创作套…

【c++】初步了解类和对象2

1、类的作用域 类定义了一个新的作用域&#xff0c;类的所有成员都在类的作用域中。在类体外定义成员时&#xff0c;需要使用 :: 作用域操作符指明成员属于哪个类域。 如图&#xff0c;此时在类内声明了函数firstUniqChar()&#xff0c;在类外进行了函数体的具体定义。 但是却…