P8754 [蓝桥杯 2021 省 AB2] 完全平方数
题解
分解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;
}

浙公网安备 33010602011771号