http://acm.hdu.edu.cn/showproblem.php?pid=5778

这题的意思就是找离x最近的一个数y,且y是一个完全平方数,还是所有质因子都只能出现两次的完全平方数

一开始的思路是直接枚举这个差值,然后去两边找,val - res和val + res找,然后超时了。

其实也很正常,因为两个完全平方数的间隔实在太大了。中间有很多的数字,

那么把思路换一下,

题意是找a^2   <=  x  <=  b^2这样子的东西,那么可以同时开方,a <= sqrt(x) <= b

这样找到的结果是一样的,然后就相当于找一个没有质因子出现过两次的数字了。

先来证明一下为什么筛素数到1e6就够了。我们要判断到1e9之内。

我们现在要找的是,不能出现多个相同质因子相乘出来的数,因为我们开方了嘛。那么,筛到1e6就够了。

对于小的素数,那么肯定可以啦,2 * 2 * ...那些肯定可以筛出来,那么大素数呢?

就是2 * bigprime <= 1e9的那些数。那些也是可以筛出来的,对于大于1e6的素数,我们确实没办法判断,但是如果它在

前面的1e6那里的小素数,都没有出现多个相同质因子相乘的话,那就是可以得了。筛不到的大质因子,就默认可以了。

因为没可能是两个bigPrime相乘的。爆了1e9了。

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <assert.h>
  7. #define IOS ios::sync_with_stdio(false)
  8. using namespace std;
  9. #define inf (0x3f3f3f3f)
  10. typedef long long int LL;
  11.  
  12. #include <iostream>
  13. #include <sstream>
  14. #include <vector>
  15. #include <set>
  16. #include <map>
  17. #include <queue>
  18. #include <string>
  19. #include <bitset>
  20. const int maxn = 1e6 + ;
  21. int prime[maxn], total;
  22. bool check[maxn];
  23. void initprime() {
  24. for (int i = ; i <= maxn - ; ++i) {
  25. if (!check[i]) {
  26. prime[++total] = i;
  27. }
  28. for (int j = ; j <= total; ++j) {
  29. if (i * prime[j] > maxn - ) break;
  30. check[i * prime[j]] = ;
  31. if (i % prime[j] == ) break;
  32. }
  33. }
  34. }
  35. bool isok(LL val) {
  36. if (val < ) return false;
  37. bool flag = false;
  38. for (int i = ; i <= total; ++i) {
  39. if (val < prime[i]) break;
  40. if (val % prime[i] == ) {
  41. val /= prime[i];
  42. if (val % prime[i] == ) return false;
  43. flag = true;
  44. // while (val % prime[i] == 0) {
  45. // val /= prime[i];
  46. // has++;
  47. // if (has == 3) return false;
  48. // flag = true;
  49. // }
  50. }
  51. }
  52. // if (val != 1) return false;
  53. return true;
  54. }
  55. void work() { // big prime * big prime TLE && 2^6 not ok
  56. LL val;
  57. // scanf("%I64d", &val);
  58. cin >> val;
  59. LL tpos = val;
  60. val = (LL)sqrt(val * 1.0);
  61. LL mid = 2e18;
  62. if (isok(val)) {
  63. mid = val * val;
  64. }
  65. LL big = 2e18, small = 2e18;
  66. for (int res = ; ; ++res) {
  67. if (isok(val + res)) {
  68. big = (val + res) * (val + res);
  69. break;
  70. }
  71. }
  72. for (int res = ; ; ++res) {
  73. if (val - res < ) break;
  74. if (isok(val - res)) {
  75. small = (val - res) * (val -res);
  76. break;
  77. }
  78. }
  79. LL ans = min(abs(tpos - big), abs(tpos - small));
  80. ans = min(ans, abs(tpos - mid));
  81. // cout << big << " " << mid << " " << small << endl;
  82. cout << ans << endl;
  83. }
  84. int main() {
  85. #ifdef local
  86. freopen("data.txt", "r", stdin);
  87. // freopen("data.txt", "w", stdout);
  88. #endif
  89. // IOS;
  90. initprime();
  91. // cout << isok(33) << endl;
  92. int t;
  93. scanf("%d", &t);
  94. while (t--) work();
  95. return ;
  96. }

HDU 5778 abs 数学的更多相关文章

  1. HDU 5778 abs (枚举)

    abs 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5778 Description Given a number x, ask positive ...

  2. HDU 5778 abs (素数,暴力)

    题意:给定一个数x,求正整数y≥2y\geq 2y≥2,使得满足以下条件: 1.y-x的绝对值最小 2.y的质因数分解式中每个质因数均恰好出现2次. 析:由于y质因数分解式中每个质因数均出现2次,那么 ...

  3. HDU 5778 abs

    题意转化一下就是寻找一个数P,要求P质因素分解完后,质因素没有重复,还要保证abs(P*P-x)最小. 暴力,在sqrt(x)附近向下向上分别枚举一下. #pragma comment(linker, ...

  4. HDU 5778 abs (暴力枚举)

    abs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem De ...

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

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

  6. HDU 1030 Delta-wave 数学题解

    给出一个数字塔,然后求沿着数字之间的边走,给出两个数字,问其路径最短的长度是多少. 看似一条搜索题目,只是有一定做题经验的人都知道,这个不是搜索题,直接搜索肯定超时. 这个是依据规律计算的数学题目. ...

  7. HDU 5673 Robot 数学

    Robot 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5673 Description There is a robot on the origi ...

  8. HDU 5914 Triangle 数学找规律

    Triangle 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5914 Description Mr. Frog has n sticks, who ...

  9. HDU 2493 Timer 数学(二分+积分)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2493 题意:给你一个圆锥,水平放置,圆锥中心轴与地面平行,将圆锥装满水,在圆锥某一表面开一个小洞,流出来 ...

随机推荐

  1. MapReduce算法形式二:去重(shuffle)

    案例二:去重(shuffle/HashSet等方法)shuffle主要针对的是key去重HashSet主要针对values去重

  2. createDocumentFragment 文档碎片提升dom增删的性能

    原理: 操作dom会使得页面进行重新渲染,如果 经常性的对dom就行操作或者一次性操作dom较多,每一次操作都会使页面进行重新渲染,降低页面加载性能. 针对IE9以下,可以使用文档碎片(documen ...

  3. iOS webView的常见属性和方法

    一.初始化与三种加载方式 UIWebView继承与UIView,因此,其初始化方法和一般的view一样,通过alloc和init进行初始化,其加载数据的方式有三种: 第一种: - (void)load ...

  4. Oracle:spool 的一个用法

    spool 是sqlplus的一个语法,非sql. 平时,我们通过ssh或者xmanger连接到oracle后,如果我们想把我们在上面操作的脚本及脚本执行过程.结果保存下来的话,可以通过spool来实 ...

  5. 深入浅出Oracle学习笔记:Buffer Cache 和Shared pool

    Buffer cache 和 share pool 是sga中最重要最复杂的部分. 一.Buffer Cache 通常数据的读取.修改都是通过buffer cache 来完成的.buffer cach ...

  6. Windows 上 GitHub Desktop 的操作

    目 录 第1章 上传开源代码至GitHub    1 1.1 git Windows 客户端    1 1.2 注册GitHub账户    2 1.3 登录    2 1.4 创建本地代码仓库     ...

  7. ES6之拷贝对象

    function copyObject(orig) { var copy = Object.create(Object.getPrototypeOf(orig)); //创建一个新的原型对象 copy ...

  8. html&css题

    1.对WEB标准以及W3C的理解与认识?(1)web标准规范要求,书写标签必须闭合.标签小写.不乱嵌套,可提高搜索机器人对网页内容的搜索几率:(2)建议使用外链css和js脚本,从而达到结构与行为.结 ...

  9. iconMoon---小图标小记

    IcoMoon 是一个免费的图标库.可以下载自己需要的图标 三.使用流程.操作演示 进入主页,点击下图所示区域开始: 每个图标你都是可以自己进行标记的(移上去会看到Edit, 点击之),然后—— 注: ...

  10. E - Alice and Bob

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...