N, D = map(int, input().split()) A = list(map(int, input().split())) from collections import defaultdict # def optimized_dp(nums, max_diff=100, threshold=3): # n = len(nums) # dp = [defaultdict(int) for _ in range(n)] # total = 0 # # 「j番目の要素」と「i番目の要素」のペアを比較し、それらを基に等差数列を構築 # # (外側のループ) i 番目の要素を終点とする等差数列の情報がすべて更新される # for i in range(n): # for j in range(i): # diff = nums[i] - nums[j] # # 差分が max_diff を超える場合はスキップ # if abs(diff) > max_diff: # continue # # j番目の要素で終わり、公差が diff の等差数列の個数 # prev = dp[j].get(diff, 0) # # 新たに i 番目の要素を加えることで、長さが1増加した等差数列を構築できるため、+1 をする。 # current = prev + 1 # # i番目の要素で終わり、公差が diff の等差数列の個数 # dp[i][diff] += current # if current >= threshold: # total += 1 # print(dp) # return total # result2 = optimized_dp(A, max_diff=2, threshold=D) # 1. テーブル定義 # キー:(数列の中身のタプル), 値:その数列ができる通り数 cnt=0 dp = defaultdict(int) # 2. 初期値(空の数列を1つとみなす、あるいは長さ1から始めるなど実装による) dp[tuple()] = 1 def is_arithmetic(seq): if len(seq) <= 2: return True diff = seq[1] - seq[0] return seq[-1] - seq[-2] == diff for x in A: # 3. 前の状態の引継ぎ prev_dp = dp.copy() # 4. 更新 for seq_tuple, count in prev_dp.items(): # 現在の数列 seq_tuple に x をくっつける new_seq = list(seq_tuple) new_seq.append(x) # 等差数列の条件を満たすなら辞書に追加 if is_arithmetic(new_seq): dp[tuple(new_seq)] = (dp[tuple(new_seq)] + count) if len(new_seq)==3: if new_seq[-1]-new_seq[-2]==D: cnt += 1 # 集計 print(cnt)