题目链接:暂无
题目描述:给一个数
x
,求
·
|x−y|
最小
·
y
的质因子数中每个质因子恰好均出现两次
数据范围:
·数据组数
·
1≤x≤1018
根据题意可知
y
是个完全平方数,那么只根据
然后从
y√
向两头枚举,不用担心找不到,因为此时
x
本身就是个质数,同样满足条件
复杂度
贴代码
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
int Q;
bool check(ll x){
for (ll i=2;i<=sqrt(x);i++)
if (x%i==0&&(x/i)%i==0)return 0;
return 1;
}
ll abs_(ll x){
if (x<0)return -x;
return x;
}
int main(){
freopen("abs.in","r",stdin);
freopen("abs.out","w",stdout);
scanf("%d",&Q);
while (Q--){
ll n,ans,x;
scanf("%lld",&n);
x=sqrt(n);
if (x*x<n)x++;
for (ll i=x;i;i++)if (check(i)){ans=abs_(i*i-n);break;}
if (x*x>n)x--;
for (ll i=x;i>=2;i--)if (check(i)){if (abs_(n-i*i)<ans)ans=abs_(n-i*i);break;}
printf("%lld\n",ans);
}
return 0;
}
【写的有漏洞的,欢迎路过大神吐槽】
2017/09/11 21:10:19
Ending.