(数论)素数,质数
// 最基本求一个素数(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(); }

浙公网安备 33010602011771号