数学知识-质数&约数

质数

试除法判定质数

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

bool check(ll x)
{
    for(ll i=2;i<=sqrt(x);i++)
    {
        if(x%i==0)
            return false;
    }
    return true;
}

int main()
{
    ll i,j,n,x;
    cin>>n;
    while(n--)
    {
        cin>>x;
        if(x==1)
            puts("No");
        else if(check(x))
            puts("Yes");
        else
            puts("No");
    }
    return 0;
}

分解质因数

例如:

6=2*3

输出:

2  1

3  1

例如:

8=2*2*2

输出:

2  3

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=110;
ll a;
int main()
{
    ll i,j,n;
    cin>>n;
    while(n--)
    {
        cin>>a;
        for(i=2;i<=a/i;i++)
        {
            if(a%i==0)
            {
                ll s=0;
                while(a%i==0)
                {
                    s++;
                    a/=i;
                }
                cout<<i<<" "<<s<<endl;
            }
        }
        if(a>1)
            cout<<a<<" "<<1<<endl;
        cout<<endl;
    }

    return 0;
}

筛质数

给定一个数n,求1~n中的质数的个数

埃式筛

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
ll n;
bool flag[maxn];

void aishi(ll x)
{
    ll ans=0;
    for(ll i=2;i<=n;i++)
    {
        if(flag[i]==false)
        {
            ans++;
            flag[i]=true;
            for(ll j=i*2;j<=n;j+=i)
                flag[j]=true;
        }
    }
    cout<<ans<<endl;
}

int main()
{
    ll i,j;
    cin>>n;
    aishi(n);

    return 0;
}

线性筛

n只会被他的最小质因子筛,每个数只筛一次

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
ll n;
bool flag[maxn];
int cnt;
int st[maxn];
void aishi()
{
    for(ll i=2;i<=n;i++)
    {
        if(flag[i]==false)
            st[cnt++]=i;
        for(ll j=0;st[j]<=n/i;j++)
        {
            flag[ st[j] * i ]=true;
            if(i%st[j]==0)
                break;
        }
    }
    cout<<cnt<<endl;
}

int main()
{
    ll i,j;
    cin>>n;
    aishi();

    return 0;
}

约数

试除法求约数

求一个数的所有约数:例如8:1*8,2*4,所以输出:1  2  4  8

#include<bits/stdc++.h>
using namespace std;
const int maxn=110;

vector<int> fun(int k)
{
    vector<int> ans;
    for(int i=1;i<=sqrt(k);i++)
    {
        if(k%i==0)
        {
            ans.push_back(i);
            if(k/i!=i)
                ans.push_back(k/i);
        }
    }
    sort(ans.begin(),ans.end());
    return ans;
}


int main()
{
    int i,j,n,t;
    cin>>n;
    while(n--)
    {
        cin>>t;
        vector<int> ans=fun(t);
        for(auto t:ans)
            cout<<t<<" ";
        cout<<endl;
    }
    return 0;
}

约数个数

给定n个正整数ai,请你输出这些数的乘积的约数个数

N=a1x1a2x2a3x3.....

个数:(x1+1)(x2+1)(x3+1)...(xn+1)

#include<bits/stdc++.h>
using namespace std;
const int maxn=110;
const int mod=1e9+7;
typedef long long ll;
ll ans;
int main()
{
    int i,j,n,x;
    cin>>n;
    ans=1;
    map<int,int>m;
    while(n--)
    {
        cin>>x;
        for(i=2;i<=sqrt(x);i++)
        {
            while(x%i==0)
            {
                m[i]++;
                x/=i;
            }
        }
        if(x>1)
            m[x]++;
    }
    for(auto t:m)
    {
        ans=ans*(t.second + 1) % mod;
    }

    cout<<ans<<endl;
    return 0;
}

约数之和

给定n个正整数ai,请你输出这些数的乘积的约数之和,答案对109+7取模。

#include<bits/stdc++.h>
using namespace std;

const int mod=1e9+7;
typedef long long ll;
map<int,int> primes;
int main()
{
    int i,j;
    int n;
    cin>>n;
    while(n--)
    {
        int x;
        cin>>x;
        for(i=2;i<=x/i;i++)
        {
            while(x%i==0)
            {
                x/=i;
                primes[i]++;
            }
        }
        if(x>1)
            primes[x]++;
    }
    ll res=1;
    for(auto pri:primes)
    {
        int p=pri.first,a=pri.second;
        ll t=1;
        while(a--)
        {
            t=(t*p+1)%mod;
        }
        res=res*t%mod;
    }
    cout<<res<<endl;
    return 0;
}

最大公约数

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

ll gcd(ll a,ll b)
{
    return b==0?a:gcd(b,a%b);
}

int main()
{
    ll i,j,n,a,b;
    cin>>n;
    while(n--)
    {
        cin>>a>>b;
        cout<<gcd(a,b)<<endl;
    }

    return 0;
}
原文地址:https://www.cnblogs.com/xiaofengzai/p/14388896.html