P8754 [藍橋杯 2021 省 AB2] 完全平方數

纯粹的發表於2024-05-08

原題連結

題解

分解n的質因子,如果為奇數就補一個
由於大於 \(\sqrt{n}\) 的質因子最多不超過一個,所以我們篩小於 \(1e6\) 的質數

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;
vector<int> prime;
vector<int> minfac(1e6+3,0);
int main()
{


    for(ll k=2;k<=1e6+3;k++)
    {
        if(!minfac[k]) prime.push_back(k);
        for(int i=0;i<prime.size()&&prime[i]*k<=1e6+2;i++)
        {
            minfac[prime[i]*k]=1;
            if(k%prime[i]==0) break;
        }
    }


    ll n;
    cin>>n;
    ll x=1;
    for(int i=0;i<prime.size();i++)
    {
        int cnt=0;
        while(n%prime[i]==0)
        {
            n/=prime[i];
            cnt++;
        }
        if(cnt&1) x*=prime[i];
    }

    if(n!=1) x*=n;//檢查是否有大於根號n的質因子
    cout<<x<<endl;

    return 0;
}

相關文章