【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);
        }
    }
}
posted @ 2021-02-25 15:27  Hyx'  阅读(78)  评论(0)    收藏  举报