Pentagon numbers
Pentagonal numbers are generated by the formula, . The first ten pentagonal numbers are:
1,5,12,22,35,51,70,92,117,145,…
It can be seen that . However, their difference, 70−22=48, is not pentagonal.
Find the pair of pentagonal numbers, and , for which their sum and difference are pentagonal and =|| is minimised; what is the value of ?
五边形数
五边形数由公式给出。前十个五边形数是:
1,5,12,22,35,51,70,92,117,145,…
可以看出。然而,它们的差70−22=48并不是五边形数。
在所有和差均为五边形数的五边形数对和中,找出使=||最小的一对;此时的值是多少?
这个题的难度不在于求D的值,在于枚举上界,那么问题的上界是多少?
假设D就是求到的最小解
假设k比j大,那么说明k没有枚举的必要了 ,说明j没有枚举的必要了;
为什么因为D要求的是最小值,而会随着n的变大而变大那么,通过发现,会随着k增大而增大;
而j是从k-1开始的,那么反过来,j越小,那么就越大,说明也没有枚举的必要了,假如j = k-1时,同理;
通过上面的两个推倒可以发现,求到的第一个满足差和都位5边形数就是最小的D值;
那么下面是代码实现:
#include <stdio.h> #include <math.h> #define MAX_N 1000000double func(int x) {//五边形数的反函数return (sqrt(2.0 * x / 3 + 1.0 / 36.0) + 1.0 / 6.0); }int Pentagon(int x) {//求五边形数函数return x * (3 * x - 1) / 2; }int is_true(int i, int j) {long long p_k = Pentagon(i);long long p_j = Pentagon(j);double num1 = func(p_k - p_j);double num2 = func(p_k + p_j);if (num1 != floor(num1)) return 0;//没有找到他们和的五边形数if (num2 != floor(num2)) return 0;//没有找到他们差的五边形数return 1; }int main() {int flag = 0;for (int i = 2; i <= MAX_N; i++) {for (int j = i - 1; j > 0; j--) {if (!is_true(i, j)) continue;printf("%d\n", Pentagon(i) - Pentagon(j));flag = 1;break;} if (flag) break;}return 0; }
最终答案:5482660