HDU5778 abs

来源:互联网 发布:韩国人看中国知乎 编辑:程序博客网 时间:2024/04/28 08:56

开方上下找每个质因数都出现一次的数,很快就能找到。

注意:(LL)sqrt(n)的平方值一般小于n,向上找的起点应该是(LL)sqrt(n)+1。

#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>#include<queue>#include<stack>#include<cstring>#include<map>#include<string>#define maxn 110000#define LL long longusing namespace std;const LL LLONG=(((LL)1<<63)-1);bool get(int temp){    LL i=2;    if(temp<2)        return false;    while(i*i<=temp)    {        int num=0;        while(temp%i==0)        {            temp/=i;            num++;            if(num>1)                return false;        }        i++;    }    return true;}int main(){    int T;    scanf("%d",&T);    while(T--)    {        LL n;        scanf("%lld",&n);        LL temp=(LL)sqrt(n);        LL ans1=-1;        for(LL i=temp;i>1;--i)        {            if(get(i))            {                ans1=i;                break;            }        }        LL ans2=-1;        for(LL i=temp+1;;++i)        {            if(get(i))            {                ans2=i;//                cout<<"ans2=="<<ans2<<endl;                break;            }        }        LL fin;        if(ans1==-1)        {            fin=abs(n-ans2*ans2);//            cout<<"1PP"<<endl;        }        else if(ans2==-1)        {//            cout<<"2PP"<<endl;            fin=abs(n-ans1*ans1);        }        else            fin=min(abs(n-ans2*ans2),abs(n-ans1*ans1));        printf("%lld\n",fin);    }}


0 0
原创粉丝点击