HDU 5778 abs 数学
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了。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <bitset>
const int maxn = 1e6 + ;
int prime[maxn], total;
bool check[maxn];
void initprime() {
for (int i = ; i <= maxn - ; ++i) {
if (!check[i]) {
prime[++total] = i;
}
for (int j = ; j <= total; ++j) {
if (i * prime[j] > maxn - ) break;
check[i * prime[j]] = ;
if (i % prime[j] == ) break;
}
}
}
bool isok(LL val) {
if (val < ) return false;
bool flag = false;
for (int i = ; i <= total; ++i) {
if (val < prime[i]) break;
if (val % prime[i] == ) {
val /= prime[i];
if (val % prime[i] == ) return false;
flag = true;
// while (val % prime[i] == 0) {
// val /= prime[i];
// has++;
// if (has == 3) return false;
// flag = true;
// }
}
}
// if (val != 1) return false;
return true;
}
void work() { // big prime * big prime TLE && 2^6 not ok
LL val;
// scanf("%I64d", &val);
cin >> val;
LL tpos = val;
val = (LL)sqrt(val * 1.0);
LL mid = 2e18;
if (isok(val)) {
mid = val * val;
}
LL big = 2e18, small = 2e18;
for (int res = ; ; ++res) {
if (isok(val + res)) {
big = (val + res) * (val + res);
break;
}
}
for (int res = ; ; ++res) {
if (val - res < ) break;
if (isok(val - res)) {
small = (val - res) * (val -res);
break;
}
}
LL ans = min(abs(tpos - big), abs(tpos - small));
ans = min(ans, abs(tpos - mid));
// cout << big << " " << mid << " " << small << endl;
cout << ans << endl;
}
int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
// IOS;
initprime();
// cout << isok(33) << endl;
int t;
scanf("%d", &t);
while (t--) work();
return ;
}
HDU 5778 abs 数学的更多相关文章
- HDU 5778 abs (枚举)
abs 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5778 Description Given a number x, ask positive ...
- HDU 5778 abs (素数,暴力)
题意:给定一个数x,求正整数y≥2y\geq 2y≥2,使得满足以下条件: 1.y-x的绝对值最小 2.y的质因数分解式中每个质因数均恰好出现2次. 析:由于y质因数分解式中每个质因数均出现2次,那么 ...
- HDU 5778 abs
题意转化一下就是寻找一个数P,要求P质因素分解完后,质因素没有重复,还要保证abs(P*P-x)最小. 暴力,在sqrt(x)附近向下向上分别枚举一下. #pragma comment(linker, ...
- HDU 5778 abs (暴力枚举)
abs Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Problem De ...
- HDU 5778 abs (BestCoder Round #85 C)素数筛+暴力
分析:y是一个无平方因子数的平方,所以可以从sqrt(x)向上向下枚举找到第一个无平方因子比较大小 大家可能觉得这样找过去暴力,但实际上无平方因子的分布式非常密集的,相关题目,可以参考 CDOJ:无平 ...
- HDU 1030 Delta-wave 数学题解
给出一个数字塔,然后求沿着数字之间的边走,给出两个数字,问其路径最短的长度是多少. 看似一条搜索题目,只是有一定做题经验的人都知道,这个不是搜索题,直接搜索肯定超时. 这个是依据规律计算的数学题目. ...
- HDU 5673 Robot 数学
Robot 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5673 Description There is a robot on the origi ...
- HDU 5914 Triangle 数学找规律
Triangle 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5914 Description Mr. Frog has n sticks, who ...
- HDU 2493 Timer 数学(二分+积分)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2493 题意:给你一个圆锥,水平放置,圆锥中心轴与地面平行,将圆锥装满水,在圆锥某一表面开一个小洞,流出来 ...
随机推荐
- JSON和JavaScript对象
var obj={width:100,height:200},这样的并不叫JSON,并且JSON只是一种数据格式,并不是具体的实例. 但很多人把这样的JS对象当成JSON,下面把这个问题讲清楚 一.J ...
- php composer 相关及版本约束等小技巧
对于现代语言而言,包管理器基本上是标配.Java有Maven,Python有pip,Ruby有gem,Nodejs有npm.PHP的则是PEAR,不过PEAR坑不少: 依赖处理容易出问题 配置非常复杂 ...
- ruby 学习网站
Ruby on Rails官网: http://rubyonrails.org/ Rails Guides:http://guides.rubyonrails.org/ -中文版: http://gu ...
- Jmeter性能测试-GC相关
1.GC相关 HotSpot虚拟机将其物理上划分为两个–新生代(young generation)和老年代(old generation).新生代(Young generation): 绝大多数最新被 ...
- codeforces 440B. Balancer 解题报告
题目链接:http://codeforces.com/problemset/problem/440/B 题目意思:给出 n 个数,求出这 n 个数的平均值avg,问对于这 n 个数里面中的每一个数,要 ...
- html5--6-57 阶段练习6-折叠导航栏
html5--6-57 阶段练习6-折叠导航栏 实例 @charset="UTF-8"; *{ ; ; } h3+div{ ; overflow: hidden; transiti ...
- Opencv中视频播放与进度控制
视频画面本质上是由一帧一帧的连续图像组成的,播放视频其实就是在播放窗口把一系列连续图像按一定的时间间隔一幅幅贴上去实现的. 人眼在连续图像的刷新最少达到每秒24帧的时候,就分辨不出来图像间的闪动了,使 ...
- 理解Objective-C Runtime (六)super
super 在Objective-C中,如果我们需要在类的方法中调用父类的方法时,通常都会用到super,如下所示: @interface MyViewController: UIViewContro ...
- UILabel 常见问题总结
写在前面:笔者在iOS软件开发中发现UILabel控件有些问题反复出现,所以在这里做点总结,方便自己查阅,也能给大家提供相关问题的解决方案. 一:当label里的内容显示满了的时候,能够自动将字体变小 ...
- Android菜单代码
前言: 学习android断断续续也有一年半左右,但一直在学习,很少回顾以往的知识.所以我打算用业余时间来写一些这样总结性的文章,希望温故知新. 以下只是我个人的一些感悟和见解(当然会查证资料验证), ...