Project Euler 44

五角数は P_n = \frac{n(3n-1)}{2}で生成される. 最初の10項は

1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ...
である.

P_4 + P_7 = 22 + 70 = 92 = P_8である. しかし差 70 - 22 = 48は五角数ではない.

五角数のペア P_jP_kについて, 差と和が五角数になるものを考える. 差を D = |P_k - P_j| と書く. 差 D の最小値を求めよ.

#include <iostream>
#include <deque>
#include <cmath>
using namespace std;

// aが平方数ならばsqrt(a)を、
// そうでないならば -1を返す
long long isSquare(long long a){
	long long b = (long long)sqrt(double(a));
	if(b*b == a) return b;
	return -1;
}

// aが三角数かどうかを判定する
bool isTrianglar(long long a){
	long long k = 1 + 24*a;

	k = 1+isSquare(k);
	if(k==0) return false;
	if(k%6==0) return true;
	
	return false;
}

int main(){
	deque<long long> pent;

	for(int i=0 ; i<5001; i++){
		pent.push_back(i*(3*i-1)/2);
	}
	pent.pop_front();

	long long k1, k2, min=(long long)99999999999;

	for(int i=1 ; i<5000 ; i++){
		for(int j=i+1 ; j<5000 ; j++){
			k1 = pent[j]+pent[i];
			k2 = pent[j]-pent[i];

			if(isTrianglar(k1)){
				//cout << "i -> " << i << ", j -> " << j << ", D -> " << k2 << endl;
				
				if(isTrianglar(k2)){
					if(min>k2){
						min = k2;
						//cout << "updated" << endl;
					}
				}
			}
		}
	}
	cout << min << endl;
}