(数论)素数,质数

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

 

posted @ 2023-06-13 14:09  o-Sakurajimamai-o  阅读(46)  评论(0)    收藏  举报
-- --