Snippets

cia_rana 今週のお題:パターゴルフのコース設計

Created by cia_rana last modified
# https://oeis.org/A213652
# https://arxiv.org/pdf/math/0505425.pdf

# r_1+r_2+...+r_m = n を満たす非負整数の組(r_1, r_2, ..., r_m)(ただし、1<=r_i<=MAX_NUM, 1<=i<=m)の組合わせの個数は
# (x+x^2+...+x^MAX_NUM)^m の x^n の係数と等しい。
# また、積式を x^m(1+x+...+x^(MAX_NUM-1))^m と整理し x^m を除けば
# (1+x+...+x^(MAX_NUM-1))^m の x^(n-m) の係数とも等しいことが分かる。
# 係数の計算は上記リンクを参照のこと。

MAX_NUM = 5

def combination(n, k)
  k = n - k if k * 2 > n
  k == 0 ? 1 : ((n - k + 1)..n).reduce(:*)/(1..k).reduce(:*)
end

def calc_pattern(m, n, max_num)
  (0..(k = n - m)/max_num).reduce(0) { |s, i| s + [1, -1][i % 2] * combination(m, i) * combination(m + k - 1 - max_num * i, m - 1) }
end

puts calc_pattern(*gets.split.map(&:to_i), MAX_NUM)

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.