(数论)素数,质数

复制代码
// 最基本求一个素数(on),(osqrt(n)) #include<bits/stdc++.h> using namespace std; int main() { int n; cin>>n; for(int i=2;i<n;i++)//o(n) if(n%i==0){ cout<<"no"; return 0; } for(int i=2;i<=n/i;i++)//o(sqrt(n)) if(n%i==0){ cout<<"no"; return 0; } cout<<"yes"; return 0; }
复制代码
复制代码
//埃氏筛,一次性求n之前所有素数(on) #include<bits/stdc++.h> using namespace std; const int N=1e5+10; int n,f[N],a[N],res,maxx=-1; map<int,int>mp; bool vis[N]; int main() { cin>>n; for(int i=0;i<n;i++) cin>>a[i],maxx=max(maxx,a[i]); for(int i=2;i<=maxx;i++){ if(!vis[i]){ mp[i]=1; for(int j=i;j<=maxx;j+=i) vis[j]=true; } } for(int i=0;i<=n;i++) if(mp.count(a[i])) cout<<a[i]<<" "; return 0; }
复制代码
复制代码
//欧拉筛(线性筛)(时间复杂度最快):https://www.luogu.com.cn/problem/P3383 //https://www.bilibili.com/video/BV1hR4y1u7e1/?spm_id_from=333.337.search-card.all.click&vd_source=b44efb267aea765a23ee5e2d900d1d5a #include<bits/stdc++.h> using namespace std; const int N=1e8+10; int n,res,k,prime[N],num; bool vis[N]; int main() { scanf("%d%d",&n,&k); for(int i=2;i<=n;i++){ if(!vis[i]) prime[++res]=i; for(int j=1;prime[j]<=n/i;j++){ vis[prime[j]*i]=true; if(!(i%prime[j])) break; } } while(k--){ scanf("%d",&num); printf("%d\n",prime[num]); } return 0; }
复制代码

 线性筛顺便计算每个数的最大质因数:

复制代码
///https://www.luogu.com.cn/problem/P8795 // 关于该题: /* 首先我们考虑正着推,首先进行第一次操作: 设初始的数为x,那么我们此时选择一个素数p,然后变成m,则此时我们x的范围为: [m-p+1,m]; 由于我们要求x越小越好,所以我们肯定要取小,即m-p+1,此时即为答案 接着推第二次操作: 此时的数为m,我们选择另一个素数p,由于我们这次的n是一个已知的值,所以我们会得到一个确切的区间 也就是[n-p+1,n],枚举这个区间,然后进行第二次操作即可 欧拉筛求出素数和最大的质因数,对于每个可能的数来说,我们取的素数一定要是最大的质因数,因为只有这样我们的最小值才会尽可能地小 */ #include<bits/stdc++.h> using namespace std; const int N=1e6+10; int main(){ int n; cin>>n; vector<int>prime(n+1),p(n+1); map<int,bool>vis; int num=0; for(int i=2;i<=n;i++){ if(!vis[i]) prime[++num]=p[i]=i; for(int j=1;prime[j]*i<=n;j++){ p[i*prime[j]]=max(p[i],prime[j]),vis[prime[j]*i]=true; if(!(i%prime[j])) break; } } if(!vis[n]) return cout<<-1,0; int res=1e18; for(int i=n-p[n]+1;i<=n;i++) if(p[i]&&vis[i]) res=min(res,i-p[i]+1); cout<<(res==1e18?-1:res); }
复制代码

 分解质因数:"任何一个数都可以被几个质数相乘得到,因为一个数可以分成几个数,如果这些数还可以分,就继续分,到最后一定会分不了,这些分不了的数就是质数,所以说一个数可以被多个质数相乘得到

复制代码
#include <bits/stdc++.h> #define int long long using namespace std; const int N=1e6+10,mod=1e9+7; signed main(){ std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); int n; cin>>n; set<int>s; for(int i=1;i<=n/i;i++) if(!(n%i)){ while(!(n%i)) n/=i; s.insert(i); } if(n>1) s.insert(n); cout<<s.size(); }
复制代码

 


__EOF__

本文作者Sakurajimamai
本文链接https://www.cnblogs.com/o-Sakurajimamai-o/p/17477376.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   o-Sakurajimamai-o  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
-- --
点击右上角即可分享
微信分享提示