题意:五边形数由公式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. CAN在汽车电子中的应用

    http://xuxiaozhao163.blog.163.com/blog/static/3793592200802784146452/ CAN是控制器局域网络(Controller Area Ne ...

  2. WordPress 在Ubuntu下安装插件、主题输入FTP及无法创建目录的问题

    1.安装新主题.插件需要输入FTP的账户密码 如果不想输入的话可以使用在wp-config.php文件中添加脚本方式. define("FS_METHOD","direc ...

  3. Docker--在ubuntu中的操作

    docker的基础命令 安装前的检查 //查看内核版本 uname -a //检查Device Mapper ls -l /sys/class/misc/device-mapper 在ubuntu中安 ...

  4. Django(七)

    一.ModelForm操作及验证 1.class Meta:class Meta: #注意以下字段不能加逗号 model = models.UserInfo #这里的all代指所用的字段,也可以是一个 ...

  5. spring mvc中的@propertysource

    在spring mvc中,在配置文件中的东西,可以在java代码中通过注解进行读取了: @PropertySource  在spring 3.1中开始引入 比如有配置文件 config.propert ...

  6. error at ::0 can't find referenced pointcut...解决方法

    error at ::0 can't find referenced pointcut...解决方法 学习了:http://dyldragon.iteye.com/blog/512612 升级aspe ...

  7. 3.2 re--正則表達式操作(Regular expression operations)

    本模块提供了正則表達式的匹配操作,它的功能跟Perl语言里的功能一样. 不管是Unicode字符串还是单字节8位组成的字符串,都能够使用模式匹配和字符串查找的功能. 只是要注意的是Unicode字符串 ...

  8. Android软键盘状态的切换及其强制隐藏

    MainActivity例如以下: package cc.c; import android.os.Bundle; import android.view.View; import android.v ...

  9. Android笔记之网络状态推断

    1.首先当然得在 manifest 中加入检查网络状态的权限: <uses-permission android:name="android.permission.ACCESS_NET ...

  10. HDU Distinct Values

    /* 一开始想到的是 对于每个区间操作 先按左端点排序(包含的区间 留这打的区间) 我们维护pos表示 a数组找到了哪 对于当前这个区间 只需要找 pos--r这个区间 用set维护能用的数 没放到a ...