「NOIP2017模拟赛09.10」绝对值

来源:互联网 发布:linux semaphore 编辑:程序博客网 时间:2024/05/17 09:44

题目链接:暂无


题目描述:给一个数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.