质因子
题意: n×x=m2
定义: 完全平方数如36=6×6,16=4×4,64=8×8
性质: 一个数A如果能组成完全平方数B,那么该完全平方数B一定能由A的质因子偶数次方形成。如8可和2组成完全平方数16,而16=(2)3×2=24,最后质因子的次数一定是偶数次方。所以,我们只要把n进行质因数分解,如果某个质因数的次数是奇数次,那么再乘上该质因数后的次数就为偶数次方了,就满足其性质了。
对于最后判断n > 1的举例: 假如 n 为24,按代码进行下去可知n=23×3,所以除了2还存在3这个质因子,那么24×(2×3)=144=122,符合题意
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n;
signed main(){
cin >> n;
int res = 1;
for(int i = 2; i*i <= n; i++){ //枚举质因子,从小的开始枚举,小于根号n的
if(n % i == 0){
int s = 0;
while(n % i == 0) s++, n /= i; //s为计数质因子的次数
if(s % 2) res *= i; //如果某个质因数的次数是奇数次,那么再乘上该质因数后的次数就为偶数次方了
}
}
if(n > 1) res *= n; //说明还存在一个质因子,且它的次数为1,那就再乘上它。这个质因子是大于根号n的
cout << res << endl;
return 0;
}
👉最后大家可以来看看数论大全: 点这里
最后的数论大全太牛了,感谢分享
懂了!质因子
#include [HTML_REMOVED]
using namespace std;
signed main(){
int n ;
cin >> n;
int res = 1;
for(int i = 2; ii <= n; i){ //枚举质因子,从小的开始枚举,小于根号n的
if(n % i == 0){
int s = 0;
while(n % i == 0) s, n /= i; //s为计数质因子的次数
if(s%2) res=i;
}
}
if(n > 1) res *= n; //说明还存在一个质因子,且它的次数为1,那就再乘上它。这个质因子是大于根号n的
cout << res << endl;
return 0;
}
咋超时了—
别忘了加#define int long long
为什么不加这个,自己开 long long 也不行呢
应该可以的,但你首先得明白哪里是要longlong的
看你这个懂了,感谢感谢
感谢+1
感谢