可爱数:
若 a 为可爱数, 则 a 不能被 i^2 整除(i>1,i为正整数)
i > a/i,则 i * i 一定大于 a
故 i 的最大取值为 a/i , 即 i <= a/i
bool LovelyNum(ll a) {//判断可爱数
for (ll i = 2; i <= a / i; i++) {
if (!(a % (i*i))) return false;
}
return true;
}
求约数:
i <= n/i
如果 i 为约数,n / i 也为约数 ,而当 i == n / i 时,只需记录其中一个约数。
故在 i != n/i 时,若 i 为约数,n / i 也为约数。
for (ll i = 1; i <= n / i; i++) {
if (!(n%i)) {
d[k++] = i;
if (i != n / i) d[k++] = n / i;
}
}
由于记录约数时,i 后面为 n / i , 故 d数组(约数数组)不是有序的。
需重新排序。
完整代码:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1000010;
typedef long long ll;
ll d[N];//存放约数
bool LovelyNum(ll a) {//判断是不是可爱数
for (ll i = 2; i <= a / i; i++) {
if (!(a % (i*i))) return false;
}
return true;
}
int main() {
int t;
cin >> t;
while (t--) {
ll n;
cin >> n;
memset(d, 0, sizeof d);
ll k = 0;
for (ll i = 1; i <= n / i; i++) {
if (!(n%i)) {
d[k++] = i;
if (i != n / i) d[k++] = n / i;
}
}
sort(d, d + k);
for (ll i = k - 1; i >= 0; i--) {
if (LovelyNum(d[i])) {
cout << d[i] << endl;
break;
}
}
}
return 0;
}