题目传送门_杭电版

题目传送门_广工版

广工版的是杭电版的加强版。

题意:判断一个质数是否是两个整数的立方差 ---- 数学题

题解:

根据立方差公式:\(a^3 - b^3 = (a - b)(a^2 + ab + b^2)\)

且 p 为质数

所以 \((a - b)(a^2 + ab + b^2)\) 其中任意一括号为 1,另一括号则为 p。

经计算检验(这里就不写啦),得 \((a - b) = 1\),\((a^2 + ab + b^2) = p\) 。

因为\((a - b) = 1\),所以两个整数a,b必然是相邻的,且通过计算,1e6的立方减去 999,999的立方已经大于1e12。

因此可以开个保存两个相邻整数的立方差,大小为1e6的数组保存立方差的值,然后用二分搜索该数组就可以。

但是!

广工版的题目 p 的范围是1e15,要使得立方差为1e15得要开到1e7的立方,这样就会爆long long。所以上述方法已经不够用了。

让我们回到 \((a - b) = 1\),\((a^2 + ab + b^2) = p\) 这条式子。

根据前一条式子可以把后面一条式子化成: \(3b^2 + 3b + 1 = p\)

把 b 当作未知量,把 p 当作常数,可把式子堪称一元二次方程了,可以弄出

\(\Delta = 12p - 3\)

然后根据求根公式可以写成:$ b = \frac{-3 \pm \sqrt{12p - 3}}{6}$

所以只需要验证两个条件:

1.\(12p - 3\) 开方后是一个整数

2.\(12p - 3\) 开方后 - 3 能否被 6 整除就可以了(因为b是正整数)

// 杭电原题:http://acm.hdu.edu.cn/showproblem.php?pid=6216
// 广工加强题:https://ac.nowcoder.com/acm/contest/3036/K
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std; typedef long long LL;
int T;
LL p, ans[9000006]; void init(){
for(LL i = 2; i <= 9000000; i++){
ans[i - 1] = i * i * i - (i - 1) * (i - 1) * (i - 1);
}
} bool check(LL p){
double a = sqrt(12 * p - 3);
long long b = sqrt(12 * p - 3);
// printf("a - b:%.16f, b:%lld\n", a - b, b);
if(a - b < 0.000001 &&((b - 3) % 6 == 0) return true;
else return false;
} int main()
{
// 搜索做法
init();
scanf("%d", &T);
while(T--){
scanf("%lld", &p);
bool ok = false;
int left = 1, right = 1000000;
while(left <= right){
int mid = (left + right) / 2;
if(ans[mid] == p) { ok = true; break; }
else if(p < ans[mid]) right = mid - 1;
else left = mid + 1;
}
if(ok) printf("YES\n");
else printf("NO\n");
} // 数学解法
scanf("%d", &T);
while(T--){
scanf("%lld", &p);
if(check(p)) printf("YES\n");
else printf("NO\n");
}
printf("i:%d num:%lld\n", 9000000, ans[8999999]);
return 0;
}

【HDU6216】 A Cubic number and A Cubic Number 和 广工的加强版的更多相关文章

  1. hdu 6216 A Cubic number and A Cubic Number【数学题】

    hdu 6216 A Cubic number and A Cubic Number[数学] 题意:判断一个素数是否是两个立方数之差,就是验差分.. 题解:只有相邻两立方数之差才可能,,因为x^3-y ...

  2. 2017青岛网络赛1011 A Cubic number and A Cubic Number

    A Cubic number and A Cubic Number Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65535/3276 ...

  3. [Javascript] Use Number() to convert to Number if possilbe

    Use map() and Number() to convert to number if possilbe or NaN. var str = ["1","1.23& ...

  4. Ugly Number,Ugly Number II,Super Ugly Number

    一.Ugly Number Write a program to check whether a given number is an ugly number. Ugly numbers are po ...

  5. leetcode 263. Ugly Number 、264. Ugly Number II 、313. Super Ugly Number 、204. Count Primes

    263. Ugly Number 注意:1.小于等于0都不属于丑数 2.while循环的判断不是num >= 0, 而是能被2 .3.5整除,即能被整除才去除这些数 class Solution ...

  6. leetcode 136. Single Number 、 137. Single Number II 、 260. Single Number III(剑指offer40 数组中只出现一次的数字)

    136. Single Number 除了一个数字,其他数字都出现了两遍. 用亦或解决,亦或的特点:1.相同的数结果为0,不同的数结果为1 2.与自己亦或为0,与0亦或为原来的数 class Solu ...

  7. java.sql.SQLException: Io 异常: Invalid number format for port number

    java.sql.SQLException: Io 异常: Invalid number format for port number   jdbc数据库链接配置没有写端口号 ​ 要检查jdbc的配置 ...

  8. Io 异常: Invalid number format for port number

    报错信息: Caused by: java.sql.SQLException: Io 异常: Invalid number format for port number    at oracle.jd ...

  9. a number of 和the number of用法

    a number of 和the number of用法 1.   A number of + 複數名詞 + 複數動詞           =some/或a lot of + 複數名詞 + 複數動詞 ...

随机推荐

  1. 奥展项目笔记01--不同网站,点击工具--开发人员工具F12,显示的页面怎么不一样

    开发人员工具F12,显示的页面不一样: 样式1: 样式2: 解决方案:兼容模式和极速模式的开发者工具不一样,改成极速模式就ok了.

  2. char (*a)[N] 与 char* a[M]区别

    已知第二维 char (*a)[N]; //指向数组的指针,实际上这里的N并没有实际的约束意义,平时也很少这么用a = (char (*)[N])malloc(sizeof(char *) * m); ...

  3. jsplumb 初识

    Jsplumb官网:https://jsplumbtoolkit.com GitHub:https://github.com/sporritt/jsplumb/    有很多官网示例 基础教程:htt ...

  4. Prometheus 安装Alertmanager集成

    Prometheus 安装Alertmanager集成 # 下载地址 地址1:https://prometheus.io/download/ 地址2:https://github.com/promet ...

  5. service的yaml说明

    apiVersion: v1 kind: Service metadata: name: nginx-service labels: app: nginx spec: ports: - port: 8 ...

  6. ThinkPad L460 拆机加ngff ssd与内存

    ThinkPad L460 拆机加ngff ssd与内存 参考链接:http://blog.sina.com.cn/s/blog_82793ae60102wgtp.html 原有配置:i5 6200U ...

  7. 在Windows10 安装 Linux 子系统

    在工作中我们经常需要在Windows中安装Linux系统来完成一些工作,通常使用VMware.virtualpc,Hyper-V等虚拟化技术来实现,Now,我们有了更便利的方法来实现,这就是Windo ...

  8. 「vue基础」一篇浅显易懂的 Vue 路由使用指南( Vue Router 下)

    大家好,在上一篇系列文章里,我们一起学习了路由的基本配置,如何创建路由和传参,本篇文章我们一起学习下 Navigation 导航和路由守卫的相关内容. Navigation 如果要改变当前路径,我们可 ...

  9. python正确使用异常处理机制

    一.不要过度使用异常 不可否认,Python 的异常机制确实方便,但滥用异常机制也会带来一些负面影响.过度使用异常主要表现在两个方面: 把异常和普通错误混淆在一起,不再编写任何错误处理代码,而是以简单 ...

  10. PIE SDK 基于Dot net bar实现比例尺控件

    最近在搭建主界面的过程中,为了界面美观大方,使用了Dot net bar.但是,在Dot net bar的状态栏中放置PIE SDK自带的比例尺控件,运行主界面程序后,比例尺控件始终不显示比例尺信息, ...