普通筛法的缺点是:对于n,它的质因子有p1,p2,p3,那么n会被划掉3次。
线性筛法的核心思想是:对于n,它只被它的最小质因子p1划掉1次。

线性筛法略加变形即可用来求质数分解和欧拉函数。
求质数分解时,一种方案是对于每个数字n,存储它的全部质因子,这样有点浪费空间。
另一种存储方案是,对于每个数字n,只存储它的最小质因子及其幂。至于其它质因子可以向前递推。这种方式节省空间。

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
const int maxn = 1000;
bool isPrime[maxn];
int prime[300], psize;//线性筛法必须用数组存储现有质数
int euler[maxn];//每个数字的欧拉函数值
//nex:每个数字的下一跳,mip:每个数字的最小质因子,ci:每个数字最小质因子的幂
int nex[maxn], mip[maxn], ci[maxn];
void init(){memset(isPrime, 1, sizeof(isPrime));psize = 0;for (int i = 2; i < maxn; i++){if (isPrime[i]){prime[psize++] = i;euler[i] = i - 1;nex[i] = i;mip[i] = i;ci[i] = 1;}for (int j = 0; j < psize&&prime[j] * i < maxn; j++){isPrime[i*prime[j]] = false;mip[i*prime[j]] = prime[j];if (i%prime[j] == 0){//说明i中已经包含prime[j]euler[i*prime[j]] = euler[i] * prime[j];nex[i*prime[j]] = nex[i];ci[i*prime[j]] = ci[i] + 1;break;}else{euler[i*prime[j]] = euler[i] * (prime[j] - 1);ci[i*prime[j]] = 1;nex[i*prime[j]] = i;}}}
}
int main(){init();for (int i = 2; i < maxn; i++){printf("%d euler=%d nex=%d ", i, euler[i], nex[i]);for (int j = i;; j = nex[j]){printf("%d^%d ", mip[j], ci[j]);if (mip[j] == nex[j])break;}puts("");}return 0;
}

转载于:https://www.cnblogs.com/weiyinfu/p/6369010.html

线性筛法求质数分解、欧拉函数相关推荐

  1. Euler:欧拉函数&素数筛

    一.欧拉函数 欧拉函数是小于x的整数中与x互质的数的个数,一般用φ(x)表示. 通式:   其中p1, p2--pn为x的所有质因数,x是不为0的整数. 比如x=12,拆成质因数为12=2*2*3, ...

  2. 【4.3 欧拉函数详解】

    更好的阅读体验\color{red}{更好的阅读体验}更好的阅读体验 目录 4.3.1 公式法求欧拉函数 4.3.2 筛法求欧拉函数 概念 1∼N1∼N1∼N中与NNN互质的数的个数被称为欧拉函数,记 ...

  3. 第二十六章 数论——欧拉函数(详解与证明)

    第二十六章 数论--欧拉函数(详解与证明) 欧拉函数 1.互质 2.欧拉函数的定义 3.欧拉函数的公式 4.欧拉函数的证明 5.欧拉函数的使用 (1)问题一: 思路 代码 (2)问题二: 思路 cas ...

  4. 线性筛法 与 线性求欧拉函数 的计算模板

    简介 懂得如何快速计算质数是十分重要的 在筛法的基础上,我们可以使用更为高级的线性筛法! 顾名思义,就是时间复杂度是线性的,即 O(N)O(N) ,N 为所求的质数范围 而对编程有所接触的人,应该都知 ...

  5. AcWing 874. 筛法求欧拉函数(线性筛法求欧拉函数模板)

    给定一个正整数 n,求 1∼n 中每个数的欧拉函数之和. 输入格式 共一行,包含一个整数 n. 输出格式 共一行,包含一个整数,表示 1∼n 中每个数的欧拉函数之和. 数据范围 1≤n≤10^6 输入 ...

  6. 欧拉线性筛法求素数(顺便实现欧拉函数的求值)

    标签:欧拉筛法   素数   欧拉函数   phi 我们先来看一下最经典的埃拉特斯特尼筛法.时间复杂度为O(n loglog n) int ans[MAXN]; void Prime(int n) { ...

  7. hdu2824(2009多校第一场) 线性筛法求欧拉函数

    欧拉函数指小于n且与其互质的数个数: phin=n*(1-1/p1)*(1-1/p2)*...(1-1/pn) 由此便可以利用类似筛素数筛出所有欧拉函数,具体看代码: 1 #include<st ...

  8. AcWing 874. 筛法求欧拉函数

    线性筛法求解欧拉函数 有关线性筛法的介绍,可以参考这道题:868. 筛质数 - AcWing题库 这道题y总采用了线性筛选法来筛选掉指定范围内的合数,筛选出质数.思维利用得极为巧妙. 结合y总讲解视频 ...

  9. 【数学知识】三种方法求 [1,n] 中所有数欧拉函数(线性筛欧拉函数优化至 O(n) )

    整理的算法模板合集: ACM模板 ①直接求小于或等于n,且与n互质的数个数(求[1,n]中所有数的欧拉函数时间复杂度:O(nn)O(n\sqrt{n})O(nn​)) ②求[1,n]之间每个数的质因数 ...

最新文章

  1. Python numpy 平方、乘方和平方根函数
  2. PMCAFF专访:搜狗effevo,这一次我们想连接“人”
  3. HDU - 5775 Bubble Sort(树状数组)
  4. 看动画学算法之:排序-count排序
  5. linux防火墙 33001端口,Linux操作系统下IPTables配置方法详解
  6. Linux crontab下关于使用date命令和sudo命令的坑
  7. tensorflow 小于_TensorFlow做Sparse Machine Learning
  8. 开源 php 生活黄页,15个PHP库,你值得拥有!(上)
  9. ZooKeeper 客户端: GUI+命令行两大类(史上最全,值得收藏)
  10. 阿里p8年薪85W到底是什么样的存在?
  11. 中国医科大学22春《毛泽东思想和中国特色社会主义理论体系概论(本科)》在线作业【标准答案】
  12. 少吃柿子、山楂、黑枣,警惕鞣酸
  13. 【GPGPU编程模型与架构原理】第一章 1.2 GPGPU 发展概述
  14. java URL java.net.URL类的使用 详细介绍 URL转义 解决URL中文字符
  15. Win95下的注册表文件(User.dat,System.dat)文件格式说明 (转)
  16. 2023最新短视频解析接口
  17. 从零开始,申请开通微信小程序全流程
  18. 电容式液位开关与浮球式液位开关的区别
  19. HEAD: HEtero-Assists Distillation for Heterogeneous Object Detectors
  20. HTML文檔中 垂直置中

热门文章

  1. 【BZOJ-2400】Spoj839Optimal Marks 最小割 + DFS
  2. [Java_kaikeba]java中堆和栈的区别(对象变量的理解)
  3. stm32 GPIO
  4. SELinux系列(七)——SELinux安全上下文的修改和设置(chcon和restorecon命令)
  5. Linux服务器之间传输文件 scp命令
  6. Linux下服务器搭建(2)——linux搭建svn服务器详细过程 及 使用TortoiseSVN客户端连接服务器
  7. 30岁,没有月入过万算失败吗?用可视化分析30岁的人收入真相
  8. 这个技能,让可视化大屏开挂一样的秀!
  9. 帆软报表设计器菜单栏介绍之一
  10. 大家都来测试测试自己的flex水平