acwing基础课——欧拉函数

news2024/9/29 15:46:19

由数据范围反推算法复杂度以及算法内容 - AcWing

常用代码模板4——数学知识 - AcWing

基本思想:

这里我们了解一下欧拉函数是什么以及用筛法求欧拉函数,我们先给出欧拉函数的定义:

 然后我们了解一下互质的概念,只要两数的公因数只有1时,就说这两个数是互质的。 

φ(N)的公式的证明会用到后续学到的容斥原理,这里就直接用容斥原理(思想大致是 在计数时,先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复)来证明

首先我们减去所有质因子的倍数,然后我们会发先现如果一个数同时是pi和pj的倍数,那么它会被减去两次,所以我们需要加起来,假如一个数是pi,pj,pk的倍数,它先被减去三次,然后加上三次,所以还需要减去一次,依次类推,奇数倍的需要减去,偶数倍的需要加上,这也就是我们的容斥原理的思想,我们将式子整理后就会得到我们的欧拉函数的公式,即证明。

873. 欧拉函数 - AcWing题库

给定 n 个正整数 ai,请你求出每个数的欧拉函数。

输入格式

第一行包含整数 n。

接下来 n 行,每行包含一个正整数 ai。

输出格式

输出共 n 行,每行输出一个正整数 ai 的欧拉函数。

数据范围

1≤n≤100,
1≤ai≤2×1e9

输入样例:

3
3
6
8

输出样例:

2
2
4
//只要两数的 公因数 只有1时,就说两数是互质数
#include<iostream>

using namespace std;

int main()
{
    int n;
    cin>>n;
    
    while(n--)
    {
        int x;
        cin >> x;
        
        int res = x;
        
        for(int i = 2; i <= x / i; i++)
        {
            if(x % i == 0)
            {
                res = res / i * (i - 1); // 等价于res = res * (1 - 1 / a)
                while(x % i == 0) x /= i;
            }
        }
        
        if(x > 1) res = res / x * (x - 1);
        
        cout << res << endl;
    }
    
    return 0;
}

筛法求欧拉函数,通过线性筛法来降低我们的时间复杂度,从O(N*根号N)降低到O(N)

在这里我们先将线性筛法的模版写出,线性筛法在数论中经常会用到,模版要牢记,然后我们来推出欧拉函数公式怎么转化,我们分成三种情况:

第一种,即特殊情况,当一个数i为质数时,那么与他互质的数就是i - 1个;

第二种,当i % pj == 0 时,phi[i] 与phi[pj * i] 只多了一个pj,因为pj是i的质因子,在phi[i]中已经减去了一个1 - 1 / pj,而且欧拉函数的公式中不用考虑质因子的指数,比较一下可以发现phi[pj * i] 比phi[i]多乘了一个pj,所以可以推出phi[pj * i] = pj * phi[i]

第三种,当i % pj != 0 时,因为pj不是i的质因子,在phi[i]中并未减去1 - 1 / pj ,所以此时phi[pj * i]应该等于phi[i] * pj * (1 - 1 / pj) ,即phi[pj * i] = phi[i] * (pj - 1)

874. 筛法求欧拉函数 - AcWing题库

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

输入格式

共一行,包含一个整数 n。

输出格式

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

数据范围

1≤n≤1e6

输入样例:

6

输出样例:

12
#include<iostream>

using namespace std;

typedef long long LL;

const int N = 1000010;

int primes[N], cnt;
int phi[N];
bool st[N];

LL get_eulers(int n)
{
    for(int i = 2; i <= n; i++)
    {
        if(!st[i])
        {
            primes[cnt++] = i;
            phi[i] = i - 1;//特殊情况 当一个数为质数时,那么与他互质的数就是i - 1
        }
        for(int j = 0; primes[j] <= n / i; j++)
        {
            st[primes[j] * i] = true;
            if(i % primes[j] == 0)
            {
                phi[primes[j] * i] = primes[j] * phi[i];
                //第一种情况 当i % pj == 0 
                //phi[i] 与phi[pj * i] 只多了一个pj
                //因为pj是i的质因子,在phi[i]中已经减去了一个1 - 1 / pj
                //而且欧拉函数的公式中不用考虑质因子的指数
                //所以可以推出phi[pj * i] = pj * phi[i]
                break;
            }
            phi[primes[j] * i] = phi[i] * (primes[j] - 1);
            //第二种情况 当i % pj != 0
            //因为pj不是i的质因子
            //在phi[i]中并未减去1 - 1 / pj
            //所以此时phi[pj * i]应该等于phi[i] * pj * (1 - 1 / pj)
            //即phi[pj * i] = phi[i] * (pj - 1)
        }
    }
}

int main()
{
    int n;
    cin >> n;
    
    cout << get_eulers(n);
    
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

连你女朋友都能看懂的分布式架构原理!

目录 从一个新闻门户网站案例引入推算一下你需要分析多少条数据&#xff1f;黄金搭档&#xff1a;分布式存储分布式计算 这篇文章聊一个话题&#xff1a;什么是分布式计算系统&#xff1f; 一、从一个新闻门户网站案例引入 现在很多同学经常会看到一些名词&#xff0c;比如分…

CSDN官方模板

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

数据结构(栈)

目录 栈的定义 形象比喻 栈的相关术语 栈的抽象数据类型&#xff08;栈Stack的ADT&#xff09; 顺序栈 顺序栈类的声明 顺序栈类成员函数的实现 基本效率分析 顺序栈的应用&#xff08;小测试&#xff09; main.cpp 共享栈 双共享栈 链式栈 链式栈基本操作分析 链…

cf Educational Codeforces Round 134 E. Prefix Function Queries

原题&#xff1a; You are given a string s, consisting of lowercase Latin letters. You are asked q queries about it: given another string t, consisting of lowercase Latin letters, perform the following steps: concatenate s and t; calculate the prefix func…

实战打靶集锦-001-Funbox2

**写在前面&#xff1a;**这应该是本人第一次自主成功完成的打靶&#xff0c;纪念一下下。 目录1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 Apache探查4.1.1 浏览器访问4.1.2 站点地图查看4.1.3 目录枚举4.1.4 公共EXP搜索4.2 FTP探查4.2.1 手工登录FTP4.2.2 公共EXP搜索…

基于决策树模型和支持向量机模型的手写数字识别

目录 1、导入库和手写数字数据集 2、 把数据可视化 3、把数据分成训练数据集和测试数据集 4、训练SVM模型 5、训练决策树模型 6、对所使用的模型进行评估 7、对手写数字图像进行预测 本项目实现了 第一个功能&#xff1a;可以通过导入库和数据集、通过对数据集的预处理…

JavaScript基础(17)_Function方法(call、apply)、arguments

概念 call&#xff0c;apply都属于Function.prototype的一个方法&#xff0c;它是JavaScript引擎内在实现的&#xff0c;因为属于Function.prototype&#xff0c;所以每个Function对象实例(就是每个方法)都有call&#xff0c;apply属性&#xff0c;可以通过函数对象来调用。 a…

2023牛客寒假算法基础集训营3 赛时思路+正解

这场数学和思维偏多&#xff0c;特别是数学&#xff0c;五个小时过于充实了&#xff0c;而且更加考验你的心态。 这场不乏码量大的毒瘤题&#xff0c;也不乏人类智慧妙妙题。 A 不断减损的时间 题意 给定一个数组aaa&#xff0c;我们可以执行任意次操作&#xff0c;该操作定义…

Rethinking Performance Gains in Image Dehazing Networks

论文源码&#xff1a;https://download.csdn.net/download/zhouaho2010/87393184 Abstract 图像去雾是低层视觉中的一个活跃话题&#xff0c;随着深度学习的快速发展&#xff0c;许多图像去雾网络被提出。尽管这些网络的工作良好&#xff0c;但提高图像去雾性能的关键机制仍不…

守望者的逃离

题目说明【问题描述】恶魔猎手尤迫安野心勃勃.他背叛了暗夜精灵&#xff0c;率深藏在海底的那加企图叛变&#xff1a;守望者在与尤迪安的交锋中遭遇了围杀.被困在一个荒芜的大岛上。为了杀死守望者&#xff0c;尤迪安开始对这个荒岛施咒&#xff0c;这座岛很快就会沉下去&#…

【java入门系列五】java基础-面向对象**

学习记录&#x1f914;类与对象内存中的布局堆栈成员方法 类内的函数传参机制传进来的是一个数组/对象&#xff0c;类似于py的list调用递归-在栈空间方法递归汉诺塔八皇后方法重载overload可变参数作用域**scope构造器/构造方法&#xff1a;新对象的初始化构造器细节对象创建流…

pytorch 笔记:torch.nn.init

这个模块中的所有函数都是用来初始化神经网络参数的&#xff0c;所以它们都在torch.no_grad()模式下运行&#xff0c;不会被autograd所考虑。 1 计算gain value 1.1 介绍 这个在后面的一些nn.init初始化中会用到 1.2 用法 torch.nn.init.calculate_gain(nonlinearity, para…

【LeetCode】回溯算法总结

回溯法解决的问题 回溯法模板 返回值&#xff1a;一般为void参数&#xff1a;先写逻辑&#xff0c;用到啥参数&#xff0c;再填啥参数终止条件&#xff1a;到达叶子节点&#xff0c;保存当前结果&#xff0c;返回遍历过程&#xff1a;回溯法一般在集合中递归搜索&#xff0c;集…

使用DiskGenius进行硬盘数据迁移

克隆硬盘 - DiskGenius 1.迁移磁盘 选择自己想要迁移的磁盘&#xff0c;点击工具-克隆磁盘 首先选择源硬盘&#xff0c;点击确定 之后选择想要迁移到的硬盘&#xff0c;点击确定 检查一下原硬盘和目标硬盘是否正确&#xff0c;此外还可以对这个空间进行二次调整。最终如果没有…

Android 中关于 FileObserver类监听文件状态的实践

文章目录需求背景走进源码实现示例参考需求背景 当某一个目录的文件发生变化&#xff08;创建、修改、删除、移动&#xff09;时&#xff0c;需要给一个回调事件给其他端调用。 其他场景&#xff1a;阅后即焚等等。 比如在 Android 的 VR 设备中&#xff0c;有一个用于部署的文…

Oracle P6 Professional专业版 22.12 中的热门新功能

目录 并排查看项目 在复制与 WBS 元素的关系时具有更大的灵活性 更轻松地确定要分配的正确基线 复制并粘贴电子表格中的单元格区域 更好地控制导入数据 检查 P6 专业版中提供的时间表报告 在排序对话框中排列字段顺序 创建导入和导出模板的副本 指定完成日期筛选器如何…

光流估计(一) 光流的简介与操作

今天是大年29&#xff0c;明天要贴春联了&#xff01;算是在年前赶出来一篇文章发&#xff08;太长时间没发东西了O。o&#xff09;&#xff0c;也算是自己在光流估计深度学习部分研究的开始~ 明年开学就是研二下学期了&#xff0c;时间过得飞快&#xff0c;毕设、实习、工作等…

MyBatis | 使用插件better-mybatis-generator自动生成dao、pojo

0️⃣简介&#x1f5fc;简介在我们编写MyBatis的项目时&#xff0c;常常需要为数据表编写大量的SQL语句以及dao类。better-mybatis-generator作为一款IDEA插件&#xff0c;可以自动为我们生成所需要的pojo类、dao类&#xff0c;并提供相当多的SQL单表查询操作。利用该插件&…

Python小技巧:富比较方法的妙用,__lt__、__le__、__eq__、__ne__、__gt__、__ge__。。。

前言 这里是Python小技巧的系列文章。这是第二篇&#xff0c;富比较方法的妙用。 在 Python中&#xff0c;富比较方法共6个&#xff0c;如下表所示&#xff1a; 见名知意&#xff0c;富比较主要用于比较。 富比较方法使用释义释义object.__lt__(self, other)x.__lt__(y)x<…

Springboot+mybatis使用PageHelper实现vue前端分页

Springbootmybatis使用PageHelper实现vue前端分页1、未分页前的vue前端效果图2、Springbootmybatis使用PageHelper分页逻辑&#xff1a;&#xff08;1&#xff09;Springboot、mybatis、PageHelper的版本&#xff1a;&#xff08;2&#xff09;yml文件配置pagehelper&#xff1…