Project Euler 44
五角数は で生成される. 最初の10項は
1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ...
である.である. しかし差 70 - 22 = 48は五角数ではない.
五角数のペア とについて, 差と和が五角数になるものを考える. 差を と書く. 差 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; }