HDU 5778 abs (枚举)

abs

题目链接:

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

Description

Given a number x, ask positive integer y≥2, that satisfy the following conditions: 1. The absolute value of y - x is minimal 2. To prime factors decomposition of Y, every element factor appears two times exactly.

Input

The first line of input is an integer T ( 1≤T≤50) For each test case,the single line contains, an integer x ( 1≤x≤1018)

Output

For each testcase print the absolute value of y - x.

Sample Input

5 1112 4290 8716 9957 9095

Sample Output

23 65 67 244 70
##题意: 对于给定的X找出一个Y,使得abs(X-Y)最小,并且Y的质数表示中,所有的幂都是2.
##题解: 一开始想的有点懵比,原因是对范围的错误估计. 实际上暴力枚举即可. 官方题解:由于y质因数分解式中每个质因数均出现2次,那么y是一个完全平方数,设y=z*z,题目可转换成求z,使得每个质因数出现1次. 我们可以暴力枚举z,检查z是否符合要求,显然当z是质数是符合要求,由素数定理可以得,z的枚举量在logn级别复杂度.
##代码: ``` cpp #include #include #include #include #include #include #include #include #include #include #include #define LL long long #define eps 1e-8 #define maxn 201000 #define mod 1000000007 #define inf 0x3f3f3f3f #define mid(a,b) ((a+b)>>1) #define IN freopen("in.txt","r",stdin); using namespace std;

bool check(LL x) {
if(x < 2) return 0;
for(LL i=2; ii<=x; i++) {
if(x % i == 0) {
if(x % (i
i) == 0)
return 0;
x /= i;
}
}
return 1;
}

int main(int argc, char const *argv[])
{
//IN;

int t; cin >> t;
while(t--)
{
    LL n; scanf("%I64d", &n);
    LL sqt = (LL)(sqrt(n)+0.5);

    LL ans = 1LL<<62;

    bool flag = 0;
    for(int i=0; ; i++) {
        LL cur = sqt + i;
        if(check(cur)) {
            ans = min(ans, abs(n-cur*cur));
            flag = 1;
        }
        cur = sqt - i;
        if(check(cur)) {
            ans = min(ans, abs(n-cur*cur));
            flag = 1;
        }
        if(flag) break;
    }

    printf("%I64d\n", ans);
}

return 0;

}

posted @ 2016-08-16 23:40  Sunshine_tcf  阅读(300)  评论(0编辑  收藏  举报