HDU 5778(abs 暴力)
2016-07-31 13:11
489 查看
题目链接
由于y质因数分解式中每个质因数均出现2次,那么y是一个完全平方数,设y=z*z,题目可转换成求z,使得每个质因数出现1次. 我们可以暴力枚举z,检查z是否符合要求,显然当z是质数是符合要求,由素数定理可以得,z的枚举量在logn级别
特殊判断一的情况就好了
由于y质因数分解式中每个质因数均出现2次,那么y是一个完全平方数,设y=z*z,题目可转换成求z,使得每个质因数出现1次. 我们可以暴力枚举z,检查z是否符合要求,显然当z是质数是符合要求,由素数定理可以得,z的枚举量在logn级别
特殊判断一的情况就好了
#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #include<string> #include<cmath> #include<map> #include<set> #include<cstdlib> #include<vector> using namespace std; #define cl(a,b) memset(a,b,sizeof(a)) #define LL long long #define pb push_back #define gcd __gcd #define For(i,j,k) for(int i=(j);i<k;i++) #define lowbit(i) (i&(-i)) #define _(x) printf("%d\n",x) const int maxn = 1e6+200; const int inf = 1 << 28; bool work(LL x){ if(x<=1)return false; for(LL i=2;i*i<=x;i++){ if(x%i==0){ if(x%(i*i)==0)return false; x/=i; } } return true; } int main(){ int T;scanf("%d",&T); while(T--){ LL n;scanf("%lld",&n); if(n==1){ cout<<"3"<<endl;continue; } LL x = (LL)(sqrt(n)+0.5); LL A=0,B=0; for(LL i=x;i>=2;i--){ if(work(i)){ A=i;break; } } for(LL i=x;;i++){ if(work(i)){ B=i;break; } } printf("%lld\n",min(abs(A*A-n),abs(B*B-n))); } return 0; }
相关文章推荐
- Hdu 5778 abs (暴力/二分)
- hdu-5778 abs(暴力枚举)
- HDU 5778 abs (BestCoder Round #85 C)素数筛+暴力
- HDU 5778 abs (数学+暴力枚举)
- HDU 5778 abs (素数,暴力)
- HDU 5778 BestCoder Round #85 abs (暴力枚举)
- HDU-5778-abs(暴力)
- HDU 5778 abs (暴力枚举)
- hdu_5778_abs(暴力)
- HDU 5778 abs(暴力枚举)——BestCoder Round #85 1003
- HDU 5778 abs (暴力枚举)
- hdu 5778 abs【暴力枚举】
- hdu 5778 abs (数论)
- HDU 5778 abs
- hdu 5778 abs(分解质因子,枚举平方数,数论)
- HDU-5778 abs(数论)
- HDU --- 5778 abs 【枚举平方数 + 思维】
- HDU-5778-abs【思维】
- HDU 5778 abs(数论)
- HDU 5778 abs 数学