当前位置: 首页 > news >正文

筛法求欧拉函数

如果只给定一个数 n ,那么这个方法可以求区间 1-n 之间任何一个数的欧拉函数

step1:

初始化 phi[1] = 1,代表 1-1 之间与 1 互为质数的数只有 1 个,就是 1

step2:

运用线性筛法。对于一个质数 p 而言,根据互质的概念(如果数 p 与数 i 互质,那么它们只有1一个公约数),在 1-p 中与 p 互质的数的个数是 p-1 个,就是 1-(p-1) 这个区间内的所有数

线性筛法:http://t.csdnimg.cn/BLddK

step3:

当 i % primes[j] == 0 时,说明 primes[j] i 的最小质因数(因为 primes[j] 中记录的质数符合从小到大的规律),那么 primes[j]*i 这个数的质因数种类和i的质因数种类相同,那么:

\phi(primes[j]*i) = (primes[j]*i)(1-\frac{1}{p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_k})

\phi(i) = i(1-\frac{1}{p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_k})

这两个公式和质因数的质数完全无关,说明两个公式中的(1-\frac{1}{p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_k})应该是完全相同的。 

所以\phi(primes[j]*i) = \phi(i)*primes[j]

step4:

当 i%primes[j] != 0 时,说明 primes[j] i 的最小质因数还要小,说明 primes[j]*i 的质因数相较于i的质因数还要多一个 primes[j] ,所以:

\phi(primes[j]*i) = (primes[j]*i)(1-\frac{1}{primes[j]})(1-\frac{1}{p_1})...(1-\frac{1}{p_k})

\phi(i) = i(1-\frac{1}{p_1})...(1-\frac{1}{p_k})

同样的,这两个公式中的(1-\frac{1}{p_1})...(1-\frac{1}{p_k})应该是一样的,所以:

\phi(primes[j]*i) = \phi(i)*primes[j]*(1-\frac{1}{primes[j]})

= \phi(i)*(primes[j]-1)

step5:

结束之后,phi 数组中记录的就应该是 1-n 中所有数的欧拉函数值,如 phi[6] 记录的就是 1-6 之间与 6 互质的数的个数

题目如下:

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

输入格式

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

输出格式

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

数据范围

1≤n≤106

代码如下 :

#include<iostream>
#include<cstring>using namespace std;typedef long long ll;const int N = 1000010;int primes[N],k;
int phi[N];//如phi[9],用来记录1-9之间与9互质的数的个数是多少
int n;
bool st[N];void euler(int n)
{phi[1] = 1;//1-1之间,与1互质的数的个数只有1本身for (int i = 2;i<=n;++i){if (st[i] == false){primes[k++] = i;phi[i] = i-1;//如果一个数i是质数,那么在1-i区间内,和i互质的数的个数是i-1个//互质定义:如果p和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] = phi[i]*primes[j];//(1)break;}phi[primes[j]*i] = phi[i] * (primes[j]-1);//(1)}}
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> n;euler(n);ll res = 0;for(int i = 1;i<=n;++i)res += phi[i];cout << res << endl;return 0;
}

 (1)为什么phi[primes[j]*i] = phi[i]*primes[j]

          为什么phi[primes[j]*i] = phi[i]*primes[j]*(1-1/primes[j]) = phi[i]*(primes[j]-1)

当 i % primes[j] == 0 时,说明 primes[j] i 的最小质因数(因为 primes[j] 中记录的质数符合从小到大的规律),那么 primes[j]*i 这个数的质因数种类和i的质因数种类相同,那么:

\phi(primes[j]*i) = (primes[j]*i)(1-\frac{1}{p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_k})

\phi(i) = i(1-\frac{1}{p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_k})

这两个公式和质因数的质数完全无关,说明两个公式中的(1-\frac{1}{p_1})(1-\frac{1}{p_2})...(1-\frac{1}{p_k})应该是完全相同的。 

所以\phi(primes[j]*i) = \phi(i)*primes[j]

当 i%primes[j] != 0 时,说明 primes[j] i 的最小质因数还要小,说明 primes[j]*i 的质因数相较于i的质因数还要多一个 primes[j] ,所以:

\phi(primes[j]*i) = (primes[j]*i)(1-\frac{1}{primes[j]})(1-\frac{1}{p_1})...(1-\frac{1}{p_k})

\phi(i) = i(1-\frac{1}{p_1})...(1-\frac{1}{p_k})

同样的,这两个公式中的(1-\frac{1}{p_1})...(1-\frac{1}{p_k})应该是一样的,所以:

\phi(primes[j]*i) = \phi(i)*primes[j]*(1-\frac{1}{primes[j]})

= \phi(i)*(primes[j]-1)

(2)为什么质数 i 的欧拉函数值就是 i-1

根据互质的性质:如果数 p 和数 i 互质,那么这两个数的公约数只有 1 

对于一个质数 i ,它的约数只有 1 和它本身,任何一个小于 i 的数都不会是 i 的约数,并且任何一个小于 i 的数和 i 的公约数只会有 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 问:说一下Java中数组的实例化方式有哪些?
  • Java-数据结构-包装类和认识泛型 !!!∑(゚Д゚ノ)ノ
  • Java Stream流式编程
  • 小程序自定义组件配合插槽和组件传值
  • 重生之我们在ES顶端相遇第11 章 - 深入自定义语言分词器
  • centos 系统yum 安装 mariadb
  • 书生大模型实战营基础(3)——LangGPT结构化提示词编写实践
  • C#基础(2)枚举
  • Linux系统安装MySQL8.0
  • ES6更新的内容中什么是proxy
  • 力扣8.29
  • React多功能管理平台项目开发全教程
  • C++ | Leetcode C++题解之第387题字符串中的第一个唯一字符
  • Go入门:gin框架极速搭建图书管理系统
  • MySQL:复合查询
  • __proto__ 和 prototype的关系
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【刷算法】从上往下打印二叉树
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • create-react-app项目添加less配置
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • IndexedDB
  • Java多态
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • js面向对象
  • leetcode98. Validate Binary Search Tree
  • linux安装openssl、swoole等扩展的具体步骤
  • Mocha测试初探
  • Mysql5.6主从复制
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • SpriteKit 技巧之添加背景图片
  • Vue 2.3、2.4 知识点小结
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • windows下mongoDB的环境配置
  • 搞机器学习要哪些技能
  • 将 Measurements 和 Units 应用到物理学
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 批量截取pdf文件
  • 使用docker-compose进行多节点部署
  • 原生js练习题---第五课
  • mysql面试题分组并合并列
  • NLPIR智能语义技术让大数据挖掘更简单
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • ​iOS安全加固方法及实现
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #100天计划# 2013年9月29日
  • #ubuntu# #git# repository git config --global --add safe.directory
  • %@ page import=%的用法
  • (12)Linux 常见的三种进程状态
  • (bean配置类的注解开发)学习Spring的第十三天
  • (js)循环条件满足时终止循环
  • (poj1.3.2)1791(构造法模拟)
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (ZT)薛涌:谈贫说富