初级数论

发布时间 2023-10-31 00:03:41作者: zhuwen
#include <bits/stdc++.h>
using namespace std;
const int P=1e9+7;
int mod(int a){//求模 
    return ((a%P)+P)%P;
}
int add(int a,int b){//加法 
    a=mod(a);
    b=mod(b);
    return (a+b)%P;
}
int mul(int a,int b){//乘法 
    a=mod(a);
    b=mod(b);
    return (a*b)%P;
}
int smul(int a,int b){//慢速乘 
    a=mod(a);
    b=mod(b);
    int res=0;
    while(b){
        if(b%2){
            res=add(res,a);
        }
        b/=2;
        a=add(a,a);
    }
    return res;
}
int fpm(int a,int n){//快速幂 
    a=mod(a);
    int res=1;
    while(n){
        if(n%2){
            res=mul(res,a);
        }
        n/=2;
        a=mul(a,a);
    }
    return res;
}
int m;          //当前质数的个数 
int v[1000010]; //v[i]的最小质因子 
int p[1000010]; //p[i]表示第i个质数 
//筛的过程就是在找最小质因子的过程 
void prime(int n)//质数筛 
{
    for(int i=2; i<=n; i++)
    {
        if(v[i] == 0)   //如果这个数字没有被筛走, 则它本身就是一个质数 
        {
            v[i] = i;   //v[i]的最小质因子就是它本身 
            p[++m] = i; //同时, 质因子的数量+1 
        }
        for(int j=1; j<=m && i*p[j]<=n; j++)    //质数在p中, 从第1个到第m个 
        {
            v[i*p[j]] = p[j];
            if(i % p[j] == 0)   //i%p[j] == 0 2 % 2 == 0 
            {
                //当i也存在最小质因子p[j]的时候, 下一个p[j]一定不是i*p[j]的最小质因子 
                break;
            }
        }
    }
}

unordered_map<int,int> um;
//key value
//底数,指数

int pfactor(int n){//质因数分解 
    for(int i=2;i*i<=n;i++){
        while(n%i==0){
            um[i]++;
            n/=i;
        }
    }
    if(n>1){
        um[n]++;
    } 
} 

int main(){
    pfactor(114514);
    for(auto e:um){
        cout<<e.first<<" "<<e.second<<endl;
    } 
    return 0;
}