质数、约数

质数的判定——试除法

时间复杂度O(sqrt(n))

写sqrt(n)比较慢,i*i<=n容易溢出

bool is_prime(int x)
{
    if(x<2) return false;
    for(int i=2;i<=x/i;i++)
        if(x%i==0) return false;
    return true;
}
View Code

分解质因数——试除法

n中只包含一个大于sqrt(n)的因子

时间复杂度O(logn~sqrt(n))

void divide(int x)
{
    for(int i=2;i<=x/i;i++)
        if(x%i==0)
        {
            int s=0;
            while(x%i==0) x/=i,s++;
            cout<<i<<" "<<s<<endl;
        }
    if(x>1) cout<<x<<" "<<1<<endl;
}
View Code

筛法

O(n^2)

void get_primes(int x)
{
    for(int i=2;i<=x;i++)
    {
        int flag=0;
        for(int j=2;j<i;j++)
        {
            if(i%j==0)
            {
                flag=1;
                break;
             } 
        }
        if(flag==0) primes[cnt++]=i;
    }
}
View Code

O(nlogn)

void get_primes(int x)
{
    for(int i=2;i<=x;i++)
    {
        if(!st[i])
        {
            primes[cnt++]=i;
        }
        for(int j=i+i;j<=x;j+=i)
            st[j]=true;
    }
}
View Code

O(nloglogn)埃氏筛

void get_primes(int x)
{
    for(int i=2;i<=x;i++)
    {
        if(!st[i])
        {
            primes[cnt++]=i;
            for(int j=i+i;j<=x;j+=i)
                st[j]=true;
        }
    }
}
View Code

O(n)欧拉筛

void get_primes(int x)
{
    for(int i=2;i<=x;i++)
    {
        if(!st[i]) primes[cnt++]=i;
        for(int j=0;primes[j]<=x/i;j++)
        {
            st[primes[j]*i]=true;
            if(i%primes[j]==0) break;
        }
    }
}
View Code

求约数——试除法

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> get_divisors(int x)
{
    vector<int> res;
    for (int i = 1; i <= x / i; i ++ )
        if (x % i == 0)
        {
            res.push_back(i);
            if (i != x / i) res.push_back(x / i);
        }
    sort(res.begin(), res.end());
    return res;
}
int main()
{
    int x;
    cin>>x;
    vector <int> ans=get_divisors(x);
    for(vector<int>::iterator i=ans.begin();i!=ans.end();i++) cout<<*i<<" ";
}
View Code

约数个数

#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
int main()
{
    int n;
    cin>>n;
    map <int,int> primes;
    for(int i=2;i<=n/i;i++)
        while(n%i==0)
        {
            n/=i;
            primes[i]++;
        }
    int ans=1;
    for(map<int,int>::iterator i=primes.begin();i!=primes.end();i++) 
    {
        ans=ans*(i->second+1);
    }
    cout<<ans;
    return 0;
}
View Code

约数之和

#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
int main()
{
    int n;
    cin>>n;
    map <int,int> primes;
    for(int i=2;i<=n/i;i++)
        while(n%i==0)
        {
            n/=i;
            primes[i]++;
        }
    if(n>1) primes[n]++;
    int ans=1;
    for(map<int,int>::iterator i=primes.begin();i!=primes.end();i++) 
    {
        int p=i->first,a=i->second;
        int t=1;
        while(a--) t=t*p+1;
        ans=ans*t;
    }
    cout<<ans;
    return 0;
}
View Code

 

posted @ 2021-02-17 12:17  standard_zsz  阅读(18)  评论(0)    收藏  举报