HDU 6216 A Cubic number and A Cubic Number(数学/二分查找)
2024-08-23 21:29:20
题意:
给定一个素数p(p <= 1e12),问是否存在一对立方差等于p。
分析:
根据平方差公式:
因为p是一个素数, 所以只能拆分成 1*p, 所以 a-b = 1.
然后代入a = b + 1. 求出 3a² + 3a + 1 = p
化简得a(a+1) = (p-1)/3
令(p-1)/3 = T, 问题化为是否存在整数a使得a(a+1) == T, 那么令 t = (int)sqrt(T),只要判定一下t * (t+1) == T ? 即可
另一种做法是打一个a的表(a只要打到1e6), 然后二分查找是否, 主要锻炼一下二分查找的代码实现。
(这题在网络赛时候我是打表找出规律的, 发现符合的数一定是形如1 + 6*(1+2+3...+k)这样的, 以后碰到这种题可以先打表看看有无规律)
代码:
数学方法:
#include <bits/stdc++.h>
using namespace std;
int main(){
int T;
scanf("%d", &T);
while(T--){
double p;
scanf("%lf", &p);
double T = (p-1.0)/;
double a = floor(sqrt(T));
if(a*(a+) == T)
printf("YES\n");
else printf("NO\n");
}
return ;
}
二分查找:
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#define ll long long using namespace std; const int MAXN = 1e6 + ;
ll tab[MAXN]; void init()
{
for (int i = ;i < MAXN;++i)
tab[i] = 3LL * i*i + * i + ;
} int main()
{
init();
int T;
scanf("%d", &T);
while(T--){
long long p;
scanf("%lld", &p);
int left = , right = MAXN - ;
int mid = (left+right) >> ;
int flag = ;
while(left <= right){
if(p == tab[mid]){
flag = ;
break;
}
else if(p > tab[mid]){
left = mid + ;
}
else right = mid - ;
mid = (left+right) >> ;
}
if(flag)
printf("YES\n");
else printf("NO\n");
}
return ;
}
最新文章
- 深入理解JS 执行细节
- 【MySQL】mysql workbench
- opencv图像操作
- C/C+小记
- java初始化笔记
- HDU 3294 (Manacher) Girls&#39; research
- Div 自适应屏幕大小
- 自己编写的基于VC++6.0的串口调试软件,并贡献源程序!
- delphi7开发webservice部属在apache服务器中 转
- 【干货】.NET开发通用组件发布(一) 介绍
- 在Redis Sentinel环境下,jedis该如何配置
- Exception in thread ";main"; org.I0Itec.zkclient.exception.ZkAuthFailedException: Authentication failure is thrown while creating kafka topic
- 异步加载js的三种方法
- 使用docker-compose部署nginx
- java之jedis使用
- Linux搭建Hadoop集群---Jdk配置
- log4net 极简配置
- Cube Stacking P0J 1988(加权并查集)
- 百家搜索:在站点中加入Google、百度等搜索引擎
- Django--登录认证
热门文章
- Cloudera Manager是啥?主要是干啥的?
- HDFS Java API
- B.华华教月月做数学
- matplotlib 绘图实例01:正弦余弦曲线
- 将picpick汉化及矩形截屏
- yum卸载遇到的问题--待解决
- spring在非容器管理的类里获取bean
- Python调用Java代码部署及初步使用
- synchronize早已经没那么笨重
- PHP Deprecated: Function split() is deprecated in /var/www/html/cacti/cmd.php on line 61