初级数论

发布时间 2023-11-01 23:03:59作者: 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;
}