abs

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)

Problem Description
Given a number x, ask positive integer y≥2, that satisfy the following conditions:
1. The absolute value of y - x is minimal
2. To prime factors decomposition of Y, every element factor appears two times exactly.
 
Input
The first line of input is an integer T ( 1≤T≤50)
For each test case,the single line contains, an integer x ( 1≤x≤1018)
 
Output
For each testcase print the absolute value of y - x
 
Sample Input
5
1112
4290
8716
9957
9095
 
Sample Output
23
65
67
244
70
 
描述:
  给你一个long long范围的数x,然后让你找到一个数y,数y的质因数分解中,每个数刚好出现两次,输出的是abs(x-y)最小。
 
题解:
  比赛的时候没想出来,后来看题解发现竟然这么水= =。
  官方题解:由于y质因数分解式中每个质因数均出现2次,那么y是一个完全平方数,设y=z*z,题目可转换成求z,使得每个质因数出现1次. 我们可以暴力枚举z,检查z是否符合要求,显然当z是质数是符合
  要求,由素数定理可以得,z的枚举量在logn级别 复杂度 O(\sqrt[4]{n}log\sqrt[2]{n}​4​​√​n​​​log​2​​√​n​​​);
  就只需要在x周围枚举就好了,枚举的范围题解说很小。。。然后z判断是不是满足条件的也很简单。
 
代码:
 #include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<cstring>
#include<queue>
#include<set>
#include<string>
#include<map>
#define inf 9223372036854775807
#define INF 9e7+5
#define PI acos(-1)
using namespace std;
typedef long long ll;
typedef double db;
const int maxn = 1e5 + ;
const int mod = 1e9 + ;
const db eps = 1e-; // 判断这个数满不满足条件。
bool ok(ll x) {
for (ll i = ; i*i <= x; i++) {
int num = ;
while (x % i == ) { /*这里的i满足while的条件肯定是素数,为什么呢,就和素数筛选法的原理差不多。*/
num++;
x /= i;
if (num > ) return false;// 如果大约两次就不满足条件
}
}
return true;
} ll abss(ll x) {
return x >= ? x : -x;
} void solve() {
ll n, ans; cin >> n;
ll z = sqrt(n+0.5D);
//cout << z << endl;
for (ll i = ; ; i++) {
ll tmp = z + i;
if (tmp * tmp >= n && ok(tmp)) { /*因为不比比n小,所以要满足 >= n这个条件,测试样例的时候发现8开方是2,然后2是满足条件的,此时找到的答案就不对。*/
ans = abss(tmp*tmp - n);
//cout << tmp << endl;
break;
}
}
for (ll i = ; ;i++) {
ll tmp = z - i;
if (ok(tmp)) {
ans = min(ans, abs(tmp*tmp - n));
break;
}
}
if (n < ) ans = - n; /*小于4的开方都是1,然后用ok函数判断的1是满足条件的,但是1不是素数,所以要特判。*/
cout << ans << endl;
} int main()
{
//cin.sync_with_stdio(false);
//freopen("isharp.in", "r", stdin);
//freopen("hh.txt", "w", stdout);
int t; cin >> t; while (t--)
solve();
return ;
}
 
 

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. BestCoder Round #50 (div.1) 1002 Run (HDU OJ 5365) 暴力枚举+正多边形判定

    题目:Click here 题意:给你n个点,有多少个正多边形(3,4,5,6). 分析:整点是不能构成正五边形和正三边形和正六边形的,所以只需暴力枚举四个点判断是否是正四边形即可. #include ...

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

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

  5. HDU 5778 abs 数学

    http://acm.hdu.edu.cn/showproblem.php?pid=5778 这题的意思就是找离x最近的一个数y,且y是一个完全平方数,还是所有质因子都只能出现两次的完全平方数 一开始 ...

  6. HDU 4462(暴力枚举)

    因为题目当中的k比较小k <= 10,所以可以直接枚举,题目里面由两个trick, 一个是如果每个点都可以放稻草人的话,那么答案是0, 另外一个就是如果可以放稻草人的点不用被照到.知道了这两个基 ...

  7. HDU 5778 abs

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

  8. hdu-5778 abs(暴力枚举)

    题目链接: abs Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 131072/131072 K (Java/Others) Pro ...

  9. HDU 6351暴力枚举 6354计算几何

    Beautiful Now Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)T ...

随机推荐

  1. laravel5.2 增加Caffienate Modules,实现模块化开发

    1.模块化开发可以把框架分成 Topc前台模块,Topm手机端前台,Admin后台管理模块,每个模块中都有自己的一套Controller,Logic,router等. 2.咖啡因模块是一个简单的包,以 ...

  2. 看鸟哥的Linux私房菜的一些命令自我总结(三)

    -修改文件创建时间或创建新文件 touch [-acdmt] -a  :仅修改访问时间 -c  :仅修改文件的时间,若该文件不存在则不创建新文件 -d  :后面可以接想要修改的日期而不用当前的日期 - ...

  3. Swift3.0 元组 (tuples)

    //元组 //不需要的元素用 _ 标记 let (name,age,_) = (","男") print(name,age) //通过下标访问特定的元素 let stud ...

  4. P5072 [Ynoi2015]盼君勿忘

    传送门 一开始理解错题意了--还以为是两个子序列相同的话只算一次--结果是子序列里相同的元素只算一次-- 对于一个区间\([l,r]\),设其中\(x\)出现了\(k\)次,那么它的贡献就是它的权值乘 ...

  5. (DP)51NOD 1007正整数分组

    将一堆正整数分为2组,要求2组的和相差最小. 例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的.   输入 第1行:一个数N,N为正整数的数量. 第 ...

  6. 关于asp.net网址出现乱码问题的解决方法

    背景: asp.net项目,C#,VS2010,.netframework 4.0 创建之初,没有任何问题,随着项目文件的增多,不免很多问题会出现, 最近就莫名其妙的发现我的项目网址多了一段乱码,很是 ...

  7. Incorrect string value: '\xE8\x8B\x8F\xE6\x99\xA8...' for column 'user_name' at row 1

    前端插入数据的时候报如下错误: Incorrect string value: '\xE8\x8B\x8F\xE6\x99\xA8...' for column 'user_name' at row ...

  8. Selenium | 基础入门

    在maven项目搭建环境: <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifact ...

  9. 修改static控件背景颜色和文字颜色

    当 static 控件或具有 ES_READONLY 风格的 edit 控件被绘制时,会向父窗口发送 WM_CTLCOLORSTATIC 消息.如果我们在窗口过程中处理该消息,就必须返回一个画刷句柄, ...

  10. Lightoj 1038 - Race to 1 Again (概率DP)

    题目链接: Lightoj  1038 - Race to 1 Again 题目描述: 给出一个数D,每次可以选择数D的一个因子,用数D除上这个因子得到一个新的数D,为数D变为1的操作次数的期望为多少 ...