题意:五边形数由公式Pn=n(3n−1)/2生成,在所有和差均为五边形数的五边形数对Pj和Pk中,找出使D = |Pk − Pj|最小的一对;此时D的值是多少?

思路:二分找和差


/*************************************************************************
> File Name: euler044.c
> Author: WArobot
> Blog: http://www.cnblogs.com/WArobot/
> Created Time: 2017年06月27日 星期二 10时59分39秒
************************************************************************/ #include <stdio.h>
#include <inttypes.h> #define MAX_N 5000
#define MAX_RANGE 37497500 bool Binary_Serch(int32_t n , int32_t *p) { // 判断n是否在数组num[]中
if (n > MAX_RANGE) return false;
int32_t l = 1 , r = MAX_N - 1 , mid;
while (l < r) {
mid = (l + r) >> 1;
if (p[mid] < n) l = mid + 1;
else r = mid;
}
return p[r] == n;
} int32_t main() {
int32_t p[MAX_N];
for (int32_t i = 1 ; i < MAX_N ; i++) {
p[i] = ( 3 * i * i - i ) / 2;
}
int32_t ans = MAX_RANGE + 10;
bool flag = false;
for (int32_t k = 1 ; k < MAX_N ; k++) { // p[k] > p[j] k 从小到大枚举 j 从大到小枚举
for (int32_t j = k - 1 ; j >= 1 ; j--) {
if (!Binary_Serch(p[k] + p[j] , p)) continue;
if (!Binary_Serch(p[k] - p[j] , p)) continue;
if (ans > p[k] - p[j]) { // 假如 ans已经被 p[k] - p[j] 更新完成那就没必要向下继续枚举j,因为向下枚举j时D肯定不会被更新
ans = p[k] - p[j]; flag = true;
break;
}
}
if (flag) break; // 如果 ans已经被更小的 p[k] - p[j] 更新过一次,那就没有必要继续枚举k了,因为向上继续枚举k并不会让D更小
}
printf("%d\n",ans);
return 0;
}

方法二:

/*************************************************************************
> File Name: test.cpp
> Author:
> Mail:
> Created Time: 2018年02月03日 星期六 08时42分28秒
************************************************************************/ #include <bits/stdc++.h>
using namespace std; typedef long long ll; ll Pentagonal(ll n) {
return n * (n * 3 - 1) / 2;
}
bool isPentagonal(ll n) {
int l = 1, r = n, mid;
while (l <= r) {
mid = (l + r) >> 1;
ll t = Pentagonal(mid);
if (t == n) {
return true;
} else if (t < n) {
l = mid + 1;
} else {
r = mid - 1;
}
}
return false;
} int main() {
ll ans = INT_MAX;
ll n = 1, m, p1, p2;
while (true) {
p1 = Pentagonal(n);
p2 = Pentagonal(n - 1);
if (p1 - p2 > ans) break;
for (int m = n - 1 ; m >= 1 ; --m) {
p2 = Pentagonal(m);
if (p1 - p2 >= ans) break;
if (isPentagonal(p1 + p2) && isPentagonal(p1 - p2)) {
ans = p1 - p2;
}
}
++n;
}
printf("ans is %lld\n", ans);
return 0;
}

Project Euler 44 Sub-string divisibility( 二分 )的更多相关文章

  1. Project Euler 44: Find the smallest pair of pentagonal numbers whose sum and difference is pentagonal.

    In Problem 42 we dealt with triangular problems, in Problem 44 of Project Euler we deal with pentago ...

  2. Python练习题 048:Project Euler 021:10000以内所有亲和数之和

    本题来自 Project Euler 第21题:https://projecteuler.net/problem=21 ''' Project Euler: Problem 21: Amicable ...

  3. Python练习题 039:Project Euler 011:网格中4个数字的最大乘积

    本题来自 Project Euler 第11题:https://projecteuler.net/problem=11 # Project Euler: Problem 10: Largest pro ...

  4. [project euler] program 4

    上一次接触 project euler 还是2011年的事情,做了前三道题,后来被第四题卡住了,前面几题的代码也没有保留下来. 今天试着暴力破解了一下,代码如下: (我大概是第 172,719 个解出 ...

  5. Python练习题 029:Project Euler 001:3和5的倍数

    开始做 Project Euler 的练习题.网站上总共有565题,真是个大题库啊! # Project Euler, Problem 1: Multiples of 3 and 5 # If we ...

  6. Project Euler 9

    题意:三个正整数a + b + c = 1000,a*a + b*b = c*c.求a*b*c. 解法:可以暴力枚举,但是也有数学方法. 首先,a,b,c中肯定有至少一个为偶数,否则和不可能为以上两个 ...

  7. project euler 169

    project euler 169 题目链接:https://projecteuler.net/problem=169 参考题解:http://tieba.baidu.com/p/2738022069 ...

  8. 【Project Euler 8】Largest product in a series

    题目要求是: The four adjacent digits in the 1000-digit number that have the greatest product are 9 × 9 × ...

  9. Project Euler 第一题效率分析

    Project Euler: 欧拉计划是一系列挑战数学或者计算机编程问题,解决这些问题需要的不仅仅是数学功底. 启动这一项目的目的在于,为乐于探索的人提供一个钻研其他领域并且学习新知识的平台,将这一平 ...

随机推荐

  1. 洛谷——P1060 开心的金明

    https://www.luogu.org/problem/show?pid=1060#sub 题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的 ...

  2. Spring深入理解(二)

    这个方法实现了 AbstractApplicationContext 的抽象方法 refreshBeanFactory,这段代码清楚的说明了 BeanFactory 的创建过程.注意 BeanFact ...

  3. Object对象具体解释(二)之clone

    clone方法会返回该实例对象的一个副本,通常情况下x.clone() != x || x.clone().getClass() == x.getClass() || x.clone().equals ...

  4. 关于TRIANGLE二维三角网格生成器在windows下的配置说明

    近期须要用到三角网格生成的一些东西,所以就把TRIANGLE这个库编译了一下,发现编译过程还是略微有些纠结,于是就想到写下来.希望以后有些童鞋看到少走一些弯路. 首先很感谢eryar的帮助,很感谢! ...

  5. [Pulgin] jQuery插件之ajaxFileUpload

    一.ajaxFileUpload是一个异步上传文件的jQuery插件. 传一个不知道什么版本的上来,以后不用到处找了. 语法:$.ajaxFileUpload([options]) options参数 ...

  6. [.Net] C# Excel操作类 ExcelHelper

    实现C#与Excel文件的交互操作,实现以下功能: 1.DataTable 导出到 Excel文件 2.Model数据实体导出到 Excel文件[List<Model>] 3.导出数据到模 ...

  7. [Javascript] 轻量级的JavaScript日期处理类库xDate使用指南

    XDate是一个请谅解的JavaScript的原生Date对象的封装库,提供增强的功能解析,格式化和日期处理.使用起来就和JavaScript自己的对象和方法一样,非常简单. XDate是一个请谅解的 ...

  8. ettercap + driftnet 实现同网段下流量欺骗

    前言: 由于在局域网中,网关会不断地发送 ARP 数据包询问当前是否有新的客户端上线,如果我们可以欺骗当前局域网网段下的主机, 把我们当成网关地址,并且我们把欺骗的流量转发到真正的网关地址,这样我们就 ...

  9. JS——BOM操作(点击按钮返回顶部案例:scrollTop的用法)

    点击按钮返回顶部案例: 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  10. POJ 1442 Treap模板

    // by SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using na ...