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

算法中的数学:算术基本定理

1.定义

任何一个大于1的自然数都可以用有限个质数的乘积表示

2.分解质因数

分解质因数就是将一个合数分解为多个质数的乘积

我们可以使用试除法来计算出结果,且由于一个合数一定不会有两个大于根号n的因子,所以我们的试除法就是遍历2到根号n的数,然后一个数能除尽就先让该数除尽再遍历下一个数去除(这样可以保证进入除法的都是质数),最后的因数若大于1,说明它就是大于根号n的因数,我们再特别判断一下即可

代码实现:
 

int cou[N];
void deprime(int x)
{for(int i = 2; i <= x/i; i++){int count = 0;while(x%i == 0){x/=i;count++;}cou[i]+=count;}if(x > 1){cou[x]++;}
}

3.例题讲解

 

审题:

本题需要我们求出N!的分解质因数结果

思路:
方法一:对阶乘的每个数分解质因数

由于先求N!会导致计算超时以及数据量过大无法保存,所以我们不对N求阶乘,而是将它的阶乘的每个数分别求质因数,最后再把总的次数相加即可。

eg:求5!的分解质因数

我们可以看成2*3*4*5,分别对这四个数分解质因数,然后将分解出来的次数累加即可,比如对于2有一个质因数2,对于4有两个质因数2,所以总共质数2出现的次数就是3.

时间复杂度:O(n*根号n),因为遍历每一个阶乘的数需要n次,而每一个数进行分解质因数又需要根号n次,而题目中N的数据范围是1e6,所以总共执行次数就为1e9,会超时
方法二:正难则反

我们可以先求出1~n的所有质数,然后去判断每个质数出现的次数

而n中的质数个数为:n/logn。判断每个质数出现的次数近似需要判断logn次,所以时间复杂度为O(n)

判断每个质数出现的次数的方法:

假设当前质数为x
用n/x即可得知x的一次方出现的次数a

用n/x^2即可得知x的平方出现的次数b

......

最后我们把a,b...都加起来就得到了质数x的总共出现次数

图示:

其实就相当于一层一层的获取质数,每次叠加一倍就是从更高次的数中获取质数出现次数

解题:
方法二

#include<iostream>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
int n,cnt;
int p[N];//存储1~n的质数
bool f[N];//判断质数
int a[N];//记录素数出现次数
void getprime()//线性筛
{for (ll i = 2; i <= n; i++){if (!f[i]) p[++cnt] = i;for (ll j = 1; i * p[j] <= n; j++){f[i * p[j]] = true;if (i % p[j] == 0) break;}}
}
int main()
{cin >> n;getprime();for (ll i = 1; i <= cnt; i++){ll sum = 0;for (ll j = p[i]; j <= n; j *= p[i]){sum += n / j;}a[p[i]] += sum;}for (ll i = 1; i <= cnt; i++){cout << p[i] << " " << a[p[i]] << endl;}return 0;
}

1.1~n的质数筛选我们使用线性筛,时间复杂度为O(n)

2.数据类型使用longlong是为了防止数据计算的时候有溢出,导致整型数据存不下


文章转载自:

http://ofjkesGq.qkgwx.cn
http://3qleMSJs.qkgwx.cn
http://CiEaITa9.qkgwx.cn
http://Pr7ll3RW.qkgwx.cn
http://1s2ghINj.qkgwx.cn
http://DLAsc8KJ.qkgwx.cn
http://NMRjNgYH.qkgwx.cn
http://Z8UYyhL2.qkgwx.cn
http://MFfOs1gh.qkgwx.cn
http://xt1lrA7p.qkgwx.cn
http://YIx5Dqmi.qkgwx.cn
http://jhBTEYfL.qkgwx.cn
http://zqpeXNpG.qkgwx.cn
http://Jp5uhueA.qkgwx.cn
http://hVGncu9W.qkgwx.cn
http://dSKJFgrE.qkgwx.cn
http://jsXF5tbY.qkgwx.cn
http://zrtLHjUB.qkgwx.cn
http://SVKgOqJt.qkgwx.cn
http://306srbsA.qkgwx.cn
http://mbSNiOxJ.qkgwx.cn
http://f83BROs1.qkgwx.cn
http://QD4LxS4o.qkgwx.cn
http://83YUteJY.qkgwx.cn
http://jFEB3LuN.qkgwx.cn
http://Ph3V0Gew.qkgwx.cn
http://22HCT4rx.qkgwx.cn
http://rVIjCjbd.qkgwx.cn
http://rzmL3r5V.qkgwx.cn
http://LtpVY8GS.qkgwx.cn
http://www.dtcms.com/a/174548.html

相关文章:

  • QuecPython+腾讯云:快速连接腾讯云l0T平台
  • Hive优化秘籍:大数据处理加速之道
  • OpenGL超大分辨率图像显示
  • 恩智浦 GoPoint 全面解析:初学者的嵌入式 AI 学习指南
  • venv和pyenv在mac上
  • 【星海随笔】信息安全管理与法律法规
  • python3使用:macOS上通过Homebrew安装pip库
  • C++GO语言微服务项目之 go语言基础语法
  • Linux——特殊权限管理
  • 【STM32单片机】#14 PWR电源控制
  • 神经网络之互动练习详解:从基础到拟合非线性数据
  • C++ 内存泄漏相关
  • OpenShift AI - OpenShift 支持的 NVIDIA GPU 共享和分区技术 2
  • Netty 的 Reactor 模型
  • 我用cursor 搭建了临时邮箱服务-Temp Mail 365
  • K-means
  • 机器学习-简要与数据集加载
  • React Native【详解】搭建开发环境,创建项目,启动项目
  • 虚拟机连不上网只有lo地址
  • 高频PCB设计如何选择PCB层数?
  • 2025年LangChain(V0.3)开发与综合案例
  • Spring MVC 如何自动将请求参数映射到 Controller 方法的参数对象(POJO)上?
  • 把其他conda的env复制到自己电脑的conda上
  • 【ULMD】基于单峰标签生成和模态分解的多模态情感分析
  • Java大师成长计划之第13天:Java中的响应式编程
  • Python实现NOA星雀优化算法优化BP神经网络分类模型项目实战
  • P56-P60 统一委托,关联游戏UI,UI动画,延迟血条
  • CSS Border 三角形阴影与多重边框的制作
  • ROS2:自定义接口文件(无废话)
  • 第100+40步 ChatGPT学习:R语言实现多轮建模