题目描述
给定一个数x,求正整数y\geq 2y≥2,使得满足以下条件:
1.y-x的绝对值最小
2.y的质因数分解式中每个质因数均恰好出现2次。
对于每组数据,输出一行y-x的最小绝对值
解法
暴力向两边找,但是要注意要先开方!
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
bool sat(ll z) {
ll l = sqrt(z);
for(ll i = 2; i <= l; i++) {
if(!(z%i)) {
z /= i;
if(!(z%i)) return false;
}
}
return true;
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
ll x;
scanf("%I64d",&x);
ll z = sqrt(x);
ll t1, t2;
bool h = false;
for(t1 = z; t1 >= 2; t1--) {
if(sat(t1)) {
h = true;
break;
}
}
for(t2 = z + 1; ; t2++) {
if(sat(t2)) break;
}
ll res = t2*t2 - x;
if(h) res = min(res, x - t1*t1);
printf("%I64d\n",res);
}
}