第四章 数学知识(一)(质数,质因子,)

一、数论

(一)判断质数

1、质数合数都是针对>=2的整数

2、质数的判断

一些因数的判断是不必要的。

#include<bits/stdc++.h>
//判断素数O(n^0.5)
using namespace std;
int n;
bool is_Prime(int n)
{if(n<2)return false;for(int i=2;i<n/i;i++){if(n%i==0)return false;}return true;
}
int main()
{cin>>n;if(is_Prime(n))puts("Yes");else puts("No");
}

(二)分解质因数和求(0~N)内的所有质数

1、初等方法(朴素方法)

(1) 因为n最多只有一个大于sqrt(n)的因子。可以和质数判断一样,n/i为条件进行迭代。

最后如果n>1,剩下的就是最后的因子(大于sqrt(n)的数)。如果等于1,那么在前面的循环中已经找到所有的因子将其除掉了。

最好O(lg(n)):当n是某个质数的整数次方的时候

#include<bits/stdc++.h>
//求解质因数869
using namespace std;
int n;
void divide(int x)
{for(int i=2;i<=n/i;i++){if(n%i==0){int res=0;while(n%i==0){n/=i;res++;}cout<<i<<" "<<res<<endl;}}if(n>1)cout<<n<<" "<<1<<endl;
}
int main()
{cin>>n;divide(n);return 0;
}

(2)分析时间复杂度

当进行n次循环的时候,i=2的时候需要n/2次循环,依此类推,得到时间复杂度为O(n ln n)<O(n log n)。

2、(埃氏筛法)优化方法:只需要把所有的质数的倍数筛掉

     按照之前的方法筛选的时候留下的都是质数,观察可以看到被筛掉的合数可以只通过前面的质数筛掉。根据质数原理:0~n之间的质数的个数为 n/ln(n) 。所以可以在之前的时间复杂度上除以一个ln(n),结果为O(n log( log n))

这样从小到大的筛法,将迭代到的所有的数的倍数都处理掉之后,每次遇到的还未被消掉的就是素数。

#include<bits/stdc++.h>
//筛选质数
using namespace std;
const int N=1e6+10;
int n,idx;
bool st[N];//是否被消除掉
int res[N];//保存质数
void divide(int x)
{for(int i=2;i<=n;i++)//前面的将其倍数全部删除之后,每次迭代到的st为false就是素数{if(!st[i]){res[idx++]=i;//消除掉所有的倍数。for(int j=i+i;j<=n;j+=i)st[j]=true;}}
}
int main()
{cin>>n;divide(n);for(int i=0;i<idx;i++)cout<<res[i]<<" ";return 0;
}

3、线性筛法(只会被自己的最小质因子筛掉))

是埃氏筛法(一个合数可能会被多个质数筛掉)的优化,

 

对于每一个数,从小到大遍历所有的质数,让每个数只被自己的最小质因数筛掉,只要找到第一个质数可以将某数删掉。

每一次循环先判断这个数有没有被筛掉过,没有被筛掉过,就保存当前数到数组。不管当前的i是不是素数,都让目前所有的素数从小到大依次乘以i。由于i是从1到2遍历。所以某个数总是被其最小质因子筛掉。

在埃氏筛法的基础上的优化位置是if(i%res[j]==0)break;

prime数组中的素数是递增的,当 i 能整除 prime[j],那么 i*prime[j+1] 这个合数肯定也可以被 prime[j] 筛掉,因为i中含有prime[j], prime[j] 比 prime[j+1] 小。

我们没有必要让prime[j+1]去筛掉prime[j+1]*i,因为由于……==0,在后面一定存在一个i,使得prime[j]*i将其删掉。后面所有的Prime[j+……] 都是这样。

#include<bits/stdc++.h>
//筛选质数(线性筛法)
using namespace std;
const int N=1e6+10;
int n,idx;
bool st[N];//是否被消除掉
int res[N];//保存质数
void divide(int x)
{for(int i=2;i<=n;i++){if(!st[i])res[idx++]=i;//从小到大遍历所有质数for(int j=0;res[j]<=n/i;j++)//设置边界,避免超出n{st[res[j]*i]=true;//让当前所有的质数乘以同一个数的结果筛掉if(i%res[j]==0)break;//res[j]一定是i的最小质因子//也一定是res[j]*i的}}
}
int main()
{cin>>n;divide(n);for(int i=0;i<idx;i++)cout<<res[i]<<" ";return 0;
}

(三)求约数的值和约数的个数和所有约数的和

 1、求一个整数的所有约数

#include<bits/stdc++.h>
//868 式除法求约数
using namespace std;
const int N=1e6+10;vector<int>get_divisor(int n)
{vector<int>ans;for(int i=1;i<n/i;i++){if(n%i==0){ans.push_back(i);if(i!=n/i)ans.push_back(n/i);}}sort(ans.begin(),ans.end());return ans;
}
int main()
{int x;cin>>x;auto res=get_divisor(x);for(auto x:res)cout<<x<<" ";
}

2、求约数的个数

求一组数的乘积的约数的个数:将每个数分解质因数,使用map存储;

#include<bits/stdc++.h>
//868 除法求约数个数using namespace std;
typedef long long LL;
const int N=1e9+7;
int main()
{int n;LL ans=1;cin>>n;unordered_map<int,int>hash;while(n--){int x;cin>>x;for(int i=2;i<=x-i;i++){while(x%i==0){hash[i]++;x/=i;}}if(x>1)hash[x]++;}for(auto p: hash)ans=ans*(p.second+1)%N;cout<<ans<<endl;
}

3、求所有约数的和 

同样用hash保存底数和对应的指数。while(b--)循环求取不同底数的等差数列的和。将所有的数相乘。

#include<bits/stdc++.h>
//求所有约数的和
using namespace std;
typedef long long LL;
const int N=1e9+7;
int main()
{int n;LL res=1;cin>>n;unordered_map<int,int>hash;while(n--){int x;cin>>x;for(int i=2;i<=x-i;i++){while(x%i==0){hash[i]++;//同样用哈希表保存数x/=i;}}if(x>1)hash[x]++;}for(auto p: hash){LL a=p.first,b=p.second;//a为底数,b为指数LL t=1;while(b--)t=(t*a+1)%N;res=res*t%N;}cout<<res<<endl;
}

(四)欧几里得算法

      (a,b)的所有公约数约数的集合,与(b,a mod b)的公约数的集合完全一致。

可知最大公约数也完全相同。

        根据这一等价代换的方法,可以一直进行这样的  代换,直到 b=0的时候,直接返回a即可。

#include<bits/stdc++.h>
//求一对数的最大公约数
using namespace std;
typedef long long LL;
const int N=1e9+7;
int gcd(int a,int b)
{return b ?gcd(b,a % b):a;
}
int main()
{int n;cin>>n;while(n--){int a,b;cin>>a>>b;int ans=gcd(a,b);cout<<ans<<endl;}
}

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

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

相关文章

pytorch常用激活函数笔记

1. relu函数&#xff1a; 公式&#xff1a; 深层网络内部激活函数常用这个 import matplotlib.pyplot as pltdef relu_fun(x):if x>0:return xelse:return 0x np.random.randn(10) y np.arange(10)plt.plot(y,x)for i ,t in enumerate(x):x[i] relu_fun(t) plt.p…

Acwing---839. 模拟堆

模拟堆 1.题目2.基本思想3.代码实现 1.题目 维护一个集合&#xff0c;初始时集合为空&#xff0c;支持如下几种操作&#xff1a; I x&#xff0c;插入一个数 x&#xff1b;PM&#xff0c;输出当前集合中的最小值&#xff1b;DM&#xff0c;删除当前集合中的最小值&#xff08…

Android:Cordova,JavaScript操作设备功能

Cordova学习 Cordova提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头、麦克风等。 Cordova还提供了一组统一的JavaScript类库,以及为这些类库所用的设备相关的原生后台代码。 Cordova是PhoneGap贡献给Apache后的开源项目,是从…

MATLAB知识点:isempty函数(★★★★☆)判断数组是否为空

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章&#xff1a;课后习题讲解中拓展的函数 在讲解第…

HarmonyOS应用开发者高级认证解析 第二季

1. 判断题 云函数打包完成后&#xff0c;需要到APPGallery Connect创建对应函数的触发器才可以在端侧中调用。 【错】打包之前创建对应函数的触发器每一个自定义组件都有自己的生命周期。 【对】基于端云一体化开发&#xff0c;开发者需要精通前端&#xff0c;后端不同的开发语…

414. Third Maximum Number(第三大的数)

题目描述 给你一个非空数组&#xff0c;返回此数组中第三大的数 。如果不存在&#xff0c;则返回数组中最大的数。 问题分析 注意要查找的数是数组中第三大的数&#xff0c;相同大小的数算一个&#xff0c;对于此问题可以采用先将数组排序然后查找第三大的数采用排序的方式最…

【java基础题型】录入3位数,求每一位是?

\t 制表符&#xff0c;用于整到8个格子 Scanner类&#xff0c;导入Scanner包(1),代码里导入Scanner类写录入&#xff0c;调用录入的对象的方法 通用求个位数&#xff0c;%10即可&#xff0c;余数不会小于除数 package java录入3位数;import java.util.Scanner; …

unity学习案例总结

动态标签 GitHub - SarahMit/DynamicLabel3D: Simple dynamic labels for a 3D Unity scene

【Effective Objective - C 2.0】——读书笔记(三)

文章目录 十五、用前缀避免命名空间冲突十六、提供全能初始化方法十七、实现description方法十八、尽量使用不可变对象十九、使用清晰而协调的命名方式二十、为私有方法名加前缀二十一、理解Objective-C错误模型二十二、理解NSCopying协议 十五、用前缀避免命名空间冲突 OC语言…

mac卸载被锁定的app

sudo chflags -hv noschg /Applications/YunShu.app 参考&#xff1a;卸载云枢&#xff08;MacOS 版&#xff09;

《UE5_C++多人TPS完整教程》学习笔记1 ——《P2 关于本课程(About This Course)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P2 关于本课程&#xff08;About This Course&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者&…

利用Python和pandas库进行股票技术分析:移动平均线和MACD指标

利用Python和pandas库进行股票技术分析&#xff1a;移动平均线和MACD指标 介绍准备工作数据准备计算移动平均线计算MACD指标结果展示完整代码演示 介绍 在股票市场中&#xff0c;技术分析是一种常用的方法&#xff0c;它通过对股票价格和交易量等历史数据的分析&#xff0c;来…

python基于flask的网上订餐系统769b9-django+vue

课题主要分为两大模块&#xff1a;即管理员模块和用户模块&#xff0c;主要功能包括个人中心、用户管理、菜品类型管理、菜品信息管理、留言反馈、在线交流、系统管理、订单管理等&#xff1b; 如果用户想要交换信息&#xff0c;他们需要满足双方交换信息的需要。由于时间有限…

蓝桥杯Web应用开发-CSS3 新特性【练习一:属性有效性验证】

练习一&#xff1a;属性有效性验证 页面上有一个邮箱输入框&#xff0c;当你的输入满足邮箱格式时&#xff0c;输入框的背景颜色为绿色&#xff1b;当你的输入不满足要求&#xff0c;背景颜色为红色。 新建一个 index2.html 文件&#xff0c;在其中写入以下内容。 <!DOCTYP…

《UE5_C++多人TPS完整教程》学习笔记8 ——《P9 访问 Steam(Acessing Steam)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P9 访问 Steam&#xff08;Acessing Steam&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者&…

2024 CKS 题库 | 4、RBAC - RoleBinding

CKS 题库 4、RBAC - RoleBinding Context 绑定到 Pod 的 ServiceAccount 的 Role 授予过度宽松的权限。完成以下项目以减少权限集。 Task 一个名为 web-pod 的现有 Pod 已在 namespace db 中运行。 编辑绑定到 Pod 的 ServiceAccount service-account-web 的现有 Role&#…

简单实践 spring clound 使用openfeign

1.概要 这是在前面工程基础上的一个变更。 前工程&#xff1a;检查实验 spring cloud nacos nacos-server-2.3.0-CSDN博客 2 代码 2.1 引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-open…

Android 10.0 锁屏壁纸 LockscreenWallpaper

前言 一、设置壁纸 通过系统设置进行锁屏壁纸和桌面壁纸的设置。 Setting 部分的代码&#xff1a; packages/apps/WallpaperPicker2/src/com/android/wallpaper/module/DefaultWallpaperPersister.java private int setStreamToWallpaperManagerCompat(InputStream inputStre…

[数学]高斯消元

介绍 用处&#xff1a;求解线性方程组 加减消元法和代入消元法 这里引用了高斯消元解线性方程组----C实现_c用高斯消元法解线性方程组-CSDN博客 改成了自己常用的形式&#xff1a; int gauss() {int c, r; // column, rowfor (c 1, r 1; c < n; c ){int maxx r; //…

《动手学深度学习(PyTorch版)》笔记8.5

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…