原題連結
題解
分解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;
}