【1059 25 素数】 Prime Factors
传送门
题意
给定一个整数 \(n\),将其进行素数分解,即写成 \(n=p_{1}^{k_{1}}\times p_{2}^{k_{2}}\times \cdots \times p_{m}^{k_{m}}\)
数据范围
\(n\leq 2\times 10^{9}\)
题解
- 根据数据范围,最大的素数因子不会超过 \(10^{5}\)
- 特判 \(n=1\) 的情况,直接输出即可
- 通过埃氏筛筛出所有的素数
- 将为因子的素数累计其指数,最后输出即可
Code
#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
#define ll long long
#define pb push_back
map<int,bool>st;
vector<ll>primes;
void get_primes(){
for(int i=2;i<=N;i++){
if(st[i]) continue;
primes.pb(i);
for(int j=i;j<=N;j+=i) st[j]=1;
}
}
int main(){
ios::sync_with_stdio(0); cin.tie();
ll n; cin>>n;
if(n==1) {
cout<<"1=1";return 0;
}
ll tn=n; get_primes();
vector<pair<int,int>>res;
for(int i=0;i<primes.size() && n>1;i++){
ll p=0;
while(n%primes[i]==0){
n/=primes[i];
p++;
}
if(p) res.pb({primes[i],p});
}
printf("%lld=",tn);
if(res[0].second>1) printf("%d^%d",res[0].first,res[0].second);
else printf("%d",res[0].first);
if(res.size()>1){
for(int i=1;i<res.size();i++){
if(res[i].second>1) printf("*%d^%d",res[i].first,res[i].second);
else printf("*%lld",res[i].first);
}
}
}

浙公网安备 33010602011771号