def main(): import sys input = sys.stdin.read().split() idx = 0 n, m = int(input[idx]), int(input[idx + 1]) idx += 2 c = list(map(int, input[idx:idx + n - 2])) idx += n - 2 # c_val[i] is the loss at position i (1-based) c_val = [0] * (n + 1) # positions 0 and n have 0 (0 is unused) for i in range(2, n): c_val[i] = c[i - 2] e0_prev = [0.0] * (n + 1) # state (x, 0) e1_prev = [0.0] * (n + 1) # state (x, 1) max_iterations = 100000 tolerance = 1e-13 for _ in range(max_iterations): e0_current = [0.0] * (n + 1) e1_current = [0.0] * (n + 1) # Update e1 (magic used) for x in range(1, n): total = 0.0 for d in range(1, m + 1): new_pos = x + d if new_pos > n: new_pos = 2 * n - new_pos if new_pos == n: term = 0.0 else: term = c_val[new_pos] + e1_prev[new_pos] total += term e1_current[x] = total / m # Update e0 (magic not used yet) for x in range(1, n): # Option a: use magic, find best d min_a = float('inf') for d in range(1, m + 1): new_pos = x + d if new_pos > n: new_pos = 2 * n - new_pos if new_pos == n: term = 0.0 else: term = c_val[new_pos] + e1_prev[new_pos] if term < min_a: min_a = term # Option b: do not use magic, average all d total_b = 0.0 for d in range(1, m + 1): new_pos = x + d if new_pos > n: new_pos = 2 * n - new_pos if new_pos == n: term = 0.0 else: term = c_val[new_pos] + e0_prev[new_pos] total_b += term avg_b = total_b / m e0_current[x] = min(min_a, avg_b) # Check for convergence max_diff = 0.0 for x in range(1, n): diff0 = abs(e0_current[x] - e0_prev[x]) diff1 = abs(e1_current[x] - e1_prev[x]) max_diff = max(max_diff, diff0, diff1) if max_diff < tolerance: break # Update previous values e0_prev, e1_prev = e0_current, e1_current print("{0:.10f}".format(e0_prev[1])) if __name__ == "__main__": main()