abs

题意:

问题描述

给定一个数x,求正整数y,使得满足以下条件:

1.y-x的绝对值最小

2.y的质因数分解式中每个质因数均恰好出现2次。

输入描述

第一行输入一个整数T

每组数据有一行,一个整数x

输出描述

对于每组数据,输出一行y-x的最小绝对值

输入样例

5

1112

4290

8716

9957

9095

输出样例

23

65

67

244

70

题解:

由于y质因数分解式中每个质因数均出现2次,那么y是一个完全平方数,设y=z*z,题目可转换成求z,使得每个质因数出现1次. 我们可以暴力枚举z,检查z是否符合要求,显然当z是质数是符合要求,由素数定理可以得,z的枚举量在logn级别 。

上面是官方题解,再说我的理解:首先看范围是1e18,不好弄,但题里又说y的质因子出现2次,故想到要根号降到1e9,这样就可以素数筛 根号1e9 内的素数了,这样就可以判断在1e9内某个数是否为素数了。之后枚举就好了,题里说y-x的绝对值,所以前后都枚举,有一个符合条件的记录,然后break就好了,PS:向前枚举到2就可以了,因为题里说y>=2。

再说下怎么判断z,也就是我写的ok函数,就直接把 根号1e9 内素数循环一次就好了,如果可以取余0 就/=,之后在判断这个是否还是取余0,如果还是就不符合,因为要求z的质因数都只出现1次。当最后/=为1的时候就可以返回真了,最后如果一次取余==0都没有,就证明这是素数,所以也返回真。

代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int INF=0x3f3f3f3f;
  5. const ll LINF=0x3f3f3f3f3f3f3f3f;
  6. #define PU puts("");
  7. #define PI(A) cout<<A<<endl
  8. #define SI(N) cin>>N
  9. #define SII(N,M) cin>>N>>M
  10. #define cle(a,val) memset(a,(val),sizeof(a))
  11. #define rep(i,b) for(int i=0;i<(b);i++)
  12. #define Rep(i,a,b) for(int i=(a);i<=(b);i++)
  13. #define reRep(i,a,b) for(int i=(a);i>=(b);i--)
  14. #define dbg(x) cout <<#x<<" = "<<x<<endl
  15. #define PIar(a,n) rep(i,n)cout<<a[i]<<" ";cout<<endl;
  16. #define PIarr(a,n,m) rep(aa,n){rep(bb, m)cout<<a[aa][bb]<<" ";cout<<endl;}
  17. const double EPS= 1e-9 ;
  18. /* ///////////////////////// C o d i n g S p a c e ///////////////////////// */
  19. const int MAXN= 40000 + 9 ;
  20. int prime[MAXN],K;
  21. bool is_prime[MAXN];
  22. int sieve(int n)
  23. {
  24. int p=0;
  25. for (int i=0;i<=n;i++) is_prime[i]=true;
  26. is_prime[1]=is_prime[0]=false;
  27. for (int i=2;i<=n;i++)
  28. {
  29. if (is_prime[i])
  30. {
  31. prime[p++]=i;
  32. for (int j=2*i;j<=n;j+=i) is_prime[j]=false;
  33. }
  34. }
  35. return p;
  36. }
  37. bool ok(ll x)
  38. {
  39. bool f=0;
  40. rep(i,K)
  41. {
  42. if (x%prime[i]==0)
  43. {
  44. f=1;
  45. x/=prime[i];
  46. if (x%prime[i]==0)
  47. return false;
  48. if (x==1) return true;
  49. }
  50. }
  51. if (!f) return true;
  52. }
  53. int main()
  54. {
  55. iostream::sync_with_stdio(false);
  56. cin.tie(0);cout.tie(0);
  57. K=sieve(MAXN);
  58. int o;
  59. SI(o);
  60. while(o--)
  61. {
  62. ll x;
  63. SI(x);
  64. ll sqx=sqrt(x);
  65. ll mi=LINF,ma=LINF;
  66. for (int i=sqx+1;i<1e9+9;i++)
  67. {
  68. if (ok(i))
  69. {
  70. ma=i;
  71. break;
  72. }
  73. }
  74. for (int i=sqx;i>=2;i--)
  75. {
  76. if (ok(i))
  77. {
  78. mi=i;
  79. break;
  80. }
  81. }
  82. PI(min(llabs(ma*ma-x),llabs(mi*mi-x)));
  83. }
  84. return 0;
  85. }

BestCoder Round #85 hdu5778 abs(素数筛+暴力)的更多相关文章

  1. Bestcoder round 18---A题(素数筛+素数打表+找三个素数其和==n)

    Primes Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  2. HDU 5778 abs (BestCoder Round #85 C)素数筛+暴力

    分析:y是一个无平方因子数的平方,所以可以从sqrt(x)向上向下枚举找到第一个无平方因子比较大小 大家可能觉得这样找过去暴力,但实际上无平方因子的分布式非常密集的,相关题目,可以参考 CDOJ:无平 ...

  3. BestCoder Round #85(ZOJ1569尚未验证)

    A题 子序列和啊,就要想到前缀和的差.这个转换一定要!记着!那么i到j的一段子序列和Sij%m ==  0就等价于(Sj-Si-1)%m == 0 了,那么什么意思呢?就是如果有两段前缀和%m的模是一 ...

  4. BestCoder Round #85

    sum Accepts: 640 Submissions: 1744 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/13107 ...

  5. BestCoder Round #85 A B C

    本来没有写博客的打算,可是看完了题解感觉这三道题这么水,我却只做出来一道,实在不应该,还是写点东西吧…… A.sum 问题描述 给定一个数列,求是否存在连续子列和为m的倍数,存在输出YES,否则输出N ...

  6. SDUT 3002-素数间隙(素数筛+暴力)

    素数间隙 Time Limit: 1000ms   Memory limit: 262144K  有疑问?点这里^_^ 题目描写叙述 Neko猫是一个非常喜欢玩数字游戏的会说话的肥猫,常常会想到非常多 ...

  7. BestCoder Round #85 前三题题解

    sum Accepts: 822 Submissions: 1744 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/13107 ...

  8. BestCoder Round #85 hdu5777 domino

    domino 题意: 问题描述 小白在玩一个游戏.桌子上有n张多米诺骨牌排成一列.它有k次机会,每次可以选一个还没有倒的骨牌,向左或者向右推倒.每个骨 牌倒下的时候,若碰到了未倒下的骨牌,可以把它推倒 ...

  9. BestCoder Round #85 hdu5776 sum

    sum 题意: 问题描述 给定一个数列,求是否存在连续子列和为m的倍数,存在输出YES,否则输出NO 输入描述 输入文件的第一行有一个正整数T,表示数据组数. 接下去有T组数据,每组数据的第一行有两个 ...

随机推荐

  1. Dijkstra + 优先队列优化 模板

    #include <cstdio> #include <cstring> #include <queue> #include <vector> #inc ...

  2. HTML 5 canvas —— 基本语法

    目录 简述 canvas 基础 2D context API 基本线条 路径 插入图像 像素级操作 文字 阴影 颜色渐变 小节 简述 HTML 5 规范引进了很多新特性,其中最令人期待的之一就是 ca ...

  3. Wireshark-BPF过滤规则

    设置过滤规则就是让网络设备只是捕获我们感兴趣的网络数据包,如果没有设置过滤规则,即上面的 filter_app 是空字符串,那么网络设备就捕获所有类型的数据包,否则只是捕获过滤规则设置的数据包,此时过 ...

  4. Goal driven performance optimization

    When your goal is to optimize application performance it is very important to understand what goal d ...

  5. datagrid中load,reload,loadData方法的区别

    它有其中有load,reload,loadData这三个方法,它们都有相同的功能,都是加载数据的,但又有区别. load方法,比如我已经定义一个datagrid的id为grid,那这个方法的使用方式为 ...

  6. asp.net系统过滤器、自定义过滤器

    原文地址:http://www.cnblogs.com/kissdodog/archive/2013/05/21/3090513.html 一.系统过滤器使用说明 1.OutputCache过滤器 O ...

  7. unity, 搜索组件

    Hierarchy的搜索栏中既可以搜节点名,也可以搜组件名.

  8. mysql 修改字符集

    查看mysql数据编码 登录MySQL服务,查看mysql数据库默认的编码 mysql> show variables like 'character%'; +----------------- ...

  9. Knockout应用开发指南(完整版) 目录索引

    http://learn.knockoutjs.com/  所有示例和代码都在在上面直接运行预览 注意:因为它用了google的cdn加速,所要要用代_理+_翻_墙才能正常加载 使用Knockout有 ...

  10. nginx 注册为服务

    使用java service wrapper将java程序注册为windows服务 分类:Java (5677)  (8) 将java注册为windows服务后,我们就直接可以通过windows的服务 ...