题目来源:P8754 [蓝桥杯 2021 省 AB2] 完全平方数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
由于本蒟蒻很少做数论的题型,导致一看到这类题型都无从下手,看完题解后才明白这题考的是什么知识点,因此写下这篇博客。
题意描述:给定一个整数n,满足n*x是完全平方数,输出找到的最小正整数x。(完全平方数的概念:若a是完全平方数,则存在一个正整数b,满足a=b*b。
知识点:分解质因子。
概念:若一个数a是完全平方数,那么它每个质因子的个数一定是偶数,比如:36,36可以分解为2*2*3*3即(2*3)^2,在比如100,100可以分解为2*2*5*5,即(2*5)^2,又好比30,30可分为2*3*5,那么它就不是完全平方数。
分析:首先求出n质因子的个数,将每个质因子的个数和位置分别用两个数组存储(套用质因数分解模板),遍历质因子的个数,当这个质因子的个数为奇数时,x就一定包含这个质因子,所以就乘以这个质因子,最后输出。
代码实现:(代码里面是质因数分解的模板,写错了)
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int N=1e5;
int a[N],cnt[N];
int t=0,ans=1;
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n;
cin >> n;
for(int i=2;i*i<=n;++i){//最大公约数模板
if(n%i==0) t++;//统计质因子个数
while(n%i==0){
a[t]=i;//标记质因子位置
cnt[t]++;//统计每个质因子的个数
n/=i;
}
}
if(n!=1){
t++;
a[t]=n;
cnt[t]++;
}
for(int i=1;i<=t;++i){
if(cnt[i]%2){//当质因子的个数为奇数时,ans乘以这个质因子
ans*=a[i];
}
}
cout << ans << endl;
return 0;
}