您的位置:首页 > 其它

HDU --- 5778 abs 【枚举平方数 + 思维】

2017-08-11 18:54 316 查看
传送门

//题意 : 给定一个x, 求与x相距最近的一个数y, 且y的每种素因子个数恰好只有2个.

//思路 : 因为y的每种素因子恰好只有两个, 那么y一定是一个平方数, 那么我们可以对x(因为和y很近)进行开根, 然后判断它的每种素因子是否恰好为一个, 如果不是这个数就不行. 否则就符合. 并且是对x开根后的两边枚举. 然后取一个绝对值小的就行了. 复杂度在O(1e3)左右.

AC Code

/** @Cain*/
#define ll long long int
bool check(ll x)  //检查x的每一种素因子是否只有一个
{
for(int i=2;i*i<=x;i++){
if(x%i == 0){
x /= i;
if(x%i == 0) return false;
}
}
return true;
}
void solve()
{
ll n; cin >> n;
ll x = sqrt(n);
ll i,j;
bool flag=false;
for(i=x;i>=4;i--){  //向下枚举
if(check(i)){
flag = true;
break;
}
}
for(j=x+1;;j++){    //向上枚举
if(check(j)) break;
}
ll res = abs(n-j*j);
if(flag) res = min(res,n-i*i);
cout << res << endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: