標籤:
分析:y是一個無平方因子數的平方,所以可以從sqrt(x)向上向下枚舉找到第一個無平方因子比較大小
大家可能覺得這樣找過去暴力,但實際上無平方因子的分布式非常密集的,相關題目,可以參考
CDOJ:無平方因子數 http://acm.uestc.edu.cn/#/problem/show/618
這個題和CDOJ的題雖然不一樣,但是可以從CDOJ發現這種數是很多的
官方題解:官方題解說這個無平方因子的枚舉量在logn層級,可見非常小
#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <iostream>#include <algorithm>#include <map>#include <queue>#include <vector>using namespace std;typedef long long LL;const int N = 1e5+5;bool v[N];int prime[N>>1],cnt;void getprime(){ for(int i=2;i*i<=N-5;++i) if(!v[i]) for(int j=i*i;j<=N-5;j+=i) v[j]=1; for(int i=2;i<=N-5;++i) if(!v[i])prime[++cnt]=i;}LL fun(LL x,LL y){ if(x>y)swap(x,y); return y-x;}int main(){ int T; getprime(); scanf("%d",&T); while(T--){ LL n;scanf("%I64d",&n); LL x=(LL)(sqrt(1.0*n)+0.5),l=-1,r=-1; for(int k=x;k>=2;--k){ bool flag=false; for(int i=1;i<=cnt&&1ll*prime[i]*prime[i]<=k;++i){ if(k%(1ll*prime[i]*prime[i])==0){flag=true;break;} } if(!flag){l=k;break;} } for(int k=x+1;;++k){ bool flag=false; for(int i=1;i<=cnt&&1ll*prime[i]*prime[i]<=k;++i){ if(k%(1ll*prime[i]*prime[i])==0){flag=true;break;} }if(!flag){r=k;break;} } LL ret; if(l==-1)ret=fun(r*r,n); else ret=min(fun(n,l*l),fun(r*r,n)); printf("%I64d\n",ret); } return 0;}
View Code
HDU 5578 abs (BestCoder Round #85 C)素數篩+暴力