「NOIP2017模拟赛09.10」绝对值

题目链接:暂无


题目描述:给一个数 x ,求y2满足
· |xy| 最小
· y 的质因子数中每个质因子恰好均出现两次
数据范围:
·数据组数T(1T50)
· 1x1018


根据题意可知 y 是个完全平方数,那么只根据y来求范围就降到 109
然后从 y 向两头枚举,不用担心找不到,因为此时 x 本身就是个质数,同样满足条件
复杂度O(n4log2n)复杂度不会证QAQ


贴代码

#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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值