hdu5778 abs
http://acm.hdu.edu.cn/showproblem.php?pid=5778
出现两次这种特殊的直接就是开方,但是规模依然过大,所以这个时候从x向两边暴力枚举
根据素数定理,logn就能碰到一个质数,所以时间复杂度合适
#include<cstdio> #include<cstring> #include<cstdlib> #include<vector> #include<algorithm> #include<functional> #include<iostream> #include<cmath> #include<string> #include<cctype> #include<stack> #include<queue> #include<set> #include<sstream> #include<map> using namespace std; #define For(i,k,n) for(int i=k;i<=n;i++) #define ForD(i,k,n) for(int i=n;i>=k;i--) #define Lson (u<<1) #define Rson ((u<<1)+1) #define MEM(a) memset(a,0,sizeof(a)); #define NEG(a) memset(a,-1,sizeof(a)); #define FILL(a) memset(a,0x3f,sizeof(a)); #define INF 0x3f3f3f3f #define LLINF 0x3f3f3f3f3f3f3f3f #define ll long long #define printbin(b,a){int tmp=a;string s;do{s+=tmp%2+'0';tmp/=2;}while(tmp);reverse(s.begin(),s.end());cout<<"bin "<<b<<"="<<s<<endl;} #define printarr(i,a,f,b) {For(i,f,b) cout<<a[i]<<" "; printf("\n");} #define ptf printf("fuck\n") #define pt(a) cout<<a<<endl #define flgprint(flg,a,b) {if(flg) printf("%s\n",a);else printf("%s\n",b);} #define fp freopen("in.txt","r",stdin) int check(ll x) { ll lim=(ll)sqrt(x)+1; For(i,2,min(lim,x)) { if(x%i==0) { x/=i; if(x%i==0) return 0; } } return 1; } int main() { int T; scanf("%d",&T); while(T--) { ll x,ans=LLINF; scanf("%lld",&x); if(x<=4) ans=4-x; else{ long long t=sqrt(x),m,l; for(l=0;; l++) { m=t+l; if(m*m>=x&&check(m)) { ans=abs(m*m-x); break; } } long long k=x-ans; for(long long i=0;;i++) { m=t-i; if(m*m<=k) break; if(check(m)) ans=min(ans,abs(m*m-x)); } } printf("%lld\n",ans); } return 0; }