どーも、みつおです。
問題
五角数は Pn = n(3n-1)/2 で生成される. 最初の10項は
1, 5, 12, 22, 35, 51, 70, 92, 117, 145, …である.
P4 + P7 = 22 + 70 = 92 = P8 である. しかし差 70 – 22 = 48 は五角数ではない.
五角数のペア Pj と Pk について, 差と和が五角数になるものを考える. 差を D = |Pk – Pj| と書く. 差 D の最小値を求めよ.
出典:Problem44
解答
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Problem44 { class Program { static void Main(string[] args) { Console.WriteLine(Solve()); Console.ReadLine(); } private static long Solve() { long ret = 0; List<long> gokakulist = new List<long>(); long num = 0; long gokakucnt = 1; int pnt = 1; long max = 0; while (true) { //五角数を求める num = (gokakucnt * (3 * gokakucnt - 1)) / 2; //五角数のリストに追加 gokakulist.Add(num); //カウントが2より少ない if (gokakulist.Count < 2) { gokakucnt++; continue; } //五角数の最大値が和より小さい max = gokakulist.Max(); var tmpmax = gokakulist[pnt] + gokakulist[pnt - 1]; //五角数の和が五角数のリストに無ければ、五角数のリストを増やす if (max < tmpmax) { gokakucnt++; continue; } //五角数の和・差が五角数のリストにあるか判定 if(IsGokaku(gokakulist,pnt++,ref ret)) { break; } //五角数の項をインクリメント gokakucnt++; } return ret; } private static bool IsGokaku(List<long> gokakulist,int cnt,ref long diff) { bool ret = false; long sum = 0; //long diff = 0; long max = gokakulist.Max(); for(int i = cnt-1; i >= 0; i--) { //和 sum = gokakulist[cnt] + gokakulist[i]; //差 diff = gokakulist[cnt] - gokakulist[i]; //五角数の和・差が、五角数のリストにあるか検索 var wa = gokakulist.IndexOf(sum); var sa = gokakulist.IndexOf(diff); //和と差がともに五角数であるか判定 if (0 < sa && 0 < wa) return true; } return ret; } } }
出力
5482660