因数质数模板合集

试除法判定质数

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

分解质因数

void div_prime(int n){
    for(int i = 2 ; i <= n /i ; i ++){
        int s = 0 ;
        while(n % i == 0 ){
            n /= i ;
            s++ ;
        }
        if(s) printf("%d %d\n" ,i ,s );
    }
    if(n != 1){
        printf("%d %d\n" ,n ,1 );
    }
}

质数线性筛

int prime[N] , cnt ;
bool vis[N] ;

void get_prime(int n) {
    for(int i = 2 ; i <= n ; i ++){
        if(!vis[i]) prime[++cnt] = i ;
            
        for(int j = 1 ; prime[j] <= n/i ; j ++){
            vis[prime[j] * i] = true ;
            if(i % prime[j] == 0 ) break ;
        }
    }
}

试除法求约数

vector<int> get_div(int n) {
    vector<int > res ;
    for(int i = 1 ; i <= n / i  ; i ++ ){
        if(n%i == 0){
            res.push_back(i) ;
            if(i != n / i ) res.push_back(n/i) ;
        }
    }
    sort(res.begin() , res.end());
    return res ;
}

约数个数(含证明)

我们将一个数分解质因数后,可得:
n = p 1 a 1 × p 2 a 2 × . . . . . . × p k a k n = p_{1}^{a_{1}}\times p_{2}^{a_{2}}\times ......\times p_{k}^{a_{k}} n=p1a1×p2a2×......×pkak
易知,n的所有因数都可由n的若干质因数和1组合而成,所以所有的因数个数是:
( a 1 + 1 ) × ( a 2 + 1 ) × . . . . . . × ( a k + 1 ) (a_{1}+1)\times(a_{2}+1)\times......\times(a_{k}+1) (a1+1)×(a2+1)×......×(ak+1)

ACwing870

#include <iostream>
#include <unordered_map>
using namespace std ;
typedef long long ll ;
ll mod = 1e9 + 7;
unordered_map<int ,int > map ;

void div_prime(int n){
    for(int i = 2 ; i <= n /i ; i ++){
        while(n%i == 0 ){
            n /= i ;
            map[i] ++ ;
        }
    }
    if(n != 1){
        map[n] ++ ;
    }
}



int main(){
    int n ;
    cin >> n ;
    for(int i = 1 ; i <= n ; i ++ ){
        int a ;
        cin >> a ;
        div_prime(a);
    }
    
    ll res = 1 ;
    for(auto t : map) res = res*(t.second+1)%mod ;
    cout << res << endl ;
    return 0 ;
}

约数之和

约数之和等于
( p 1 0 + p 1 1 + . . . . . . + p 1 a 1 ) × ( p 2 0 + p 2 1 + . . . . . . + p 2 a 2 ) × . . . . . . . × ( p k 0 + p k 1 + . . . . . . + p k a k ) (p_{1}^{0} + p_{1}^{1} + ......+p_{1}^{a_{1}})\times(p_{2}^{0} + p_{2}^{1} + ......+p_{2}^{a_{2}})\times.......\times(p_{k}^{0} + p_{k}^{1} + ......+p_{k}^{a_{k}}) (p10+p11+......+p1a1)×(p20+p21+......+p2a2)×.......×(pk0+pk1+......+pkak)

ACwing871

#include <iostream>
#include <cstring>
#include <unordered_map>
#define debug(x) cerr << #x << " : " << x << endl
using namespace std ;
const int mod = 1e9 + 7;
int main(){
    int n ;
    cin >> n ;
    unordered_map<int ,int > map ;
    while(n -- ){
        int a ;
        cin >> a ;
        // debug(a) ;
        // debug(n) ;
        for(int i = 2 ; i <= a/i ; i ++){
            while(a%i == 0 ){
                a /= i ;
                map[i] ++ ;
            }
        }
        if(a > 1 ) map[a] ++ ;
    }
    long long ans = 1 ;
    for(auto t : map){
        int a = t.first , b = t.second ;
        // debug(a);
        // debug(b);
        long long p = 1 ;
        while(b --) p = (p*a + 1)%mod ;
        ans = (ans * p)%mod ;
    }
    cout << ans << endl ;
    return 0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值