hdu_5778_abs(暴力)
题目链接:hdu_5778_abs
题意:
给你一个数x,然你找一个y,这个y只能被素数分解,每一个素数恰好出现2次,求y-x的绝对值最小
题解:
给官方的 ps:数据太水,打35个素数也能过
1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std; 4 typedef long long ll; 5 const int E_N=35; 6 int p[E_N],tot; 7 bool vis[E_N+1]; 8 void Euler(){ 9 F(i,2,E_N){ 10 if(!vis[i])p[++tot]=i; 11 F(j,1,tot){ 12 if(i*p[j]>E_N)break; 13 vis[i*p[j]]=1; 14 if(i%p[j]==0)break; 15 } 16 } 17 } 18 19 bool check(int x) 20 { 21 for(int i=1;i<=tot&&p[i]*p[i]<x;i++)if(x%p[i]==0) 22 { 23 x/=p[i]; 24 if(x%p[i]==0)return 0; 25 } 26 return 1; 27 } 28 29 int main(){ 30 Euler(); 31 int t;scanf("%d",&t); 32 while(t--) 33 { 34 ll n,ans; 35 scanf("%lld",&n); 36 int tmp=(ll)sqrt(n+0.5); 37 if(tmp<2){printf("%lld\n",4ll-n);continue;} 38 for(int i=tmp;i>=2;i--) 39 if(check(i)){ans=abs(1ll*i*i-n);break;} 40 for(int i=tmp+1;;i++) 41 if(check(i)){ans=min(ans,abs(1ll*i*i-n));break;} 42 printf("%lld\n",ans); 43 } 44 return 0; 45 }