您的位置:首页 > 其它

Hdu 5778 abs (暴力/二分)

2016-07-31 19:49 330 查看
题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5778

题目大意:

给定一个数x,求正整数y≥2,使得满足以下条件:

1.y−x的绝对值最小

2.y的质因数分解式中每个质因数均恰好出现2次。

简单分析:

y的质因数分解式中每个质因数均恰好出现2次,显然y是个完全平方数,但不是所有的完全平方数满足每个质因数恰好出现2次,y−x绝对值最小的数,显然当y√在x√附近且满足条件时,绝对值最小,对x√分解质因数,若有一个因数出现2次以上,则不满足条件,减小此值,继续向下搜索,由于这样的数出现的非常频繁,所以复杂度不会爆,然后再从x√+1开始向上查找,直到找到一个满足的值,比较两次找到的数的平方与x的绝对值,最后输出小的那个

注1:第二次从x√+1开始主要是为了防止某个数x,x√满足条件,但x√+1也满足,且答案更小,

注2:由于y≥2,还需要加特判当x≤4时,y都只能等于4,4为最小的满足条件的y值,此时当输出4−x

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;

long long int x,y,temp;

bool cha(long long kai)
{
long long int i;
for(i=2;i*i<kai;i++)
{
if (kai%i==0)
{
kai/=i;
if (kai%i==0)
return true;
}
}
return false;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lld",&x);
long long kai1=(long long)sqrt(x);
long long  kai2=kai1;
while(cha(kai1))
{
kai1=kai1-1;
}
y=abs(kai1*kai1-x);
kai2++;
while(cha(kai2))
{
kai2=kai2+1;
}
y=min(y,abs(kai2*kai2-x));
if (x<=4)
y = 4-x;
printf("%lld\n",abs(y));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: