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

传送门
//题意 : 给定一个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;
}

你可能感兴趣的:(数的因子(约数),素数相关)