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 }
View Code

 

posted @ 2016-07-31 12:59  bin_gege  阅读(456)  评论(0编辑  收藏  举报