zoukankan      html  css  js  c++  java
  • 数学知识-质数&约数

    质数

    试除法判定质数

    #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;
    }
  • 相关阅读:
    BLOB
    cesium 检测视图改变的代码
    有关Nodejs的一些插件介绍
    线程基础知识
    进程和线程概念对比
    C#对象与XMl文件之间的相互转换(转)
    简介C#读取XML的方式(转)
    关于c# Debug和Release的区别 (转)
    c++堆和栈(转)
    浅谈C#堆栈与托管堆的工作方式(转)
  • 原文地址:https://www.cnblogs.com/xiaofengzai/p/14388896.html
Copyright © 2011-2022 走看看