AtCoder ARC107 に参加してきた

atcoder.jp

今回はA, B 問題をなんとかクリア。

A - Simple Math

A, B, C の総和を求めてから掛ければいいのかなって思ったら通った。

    a = 1..a |> Enum.sum() |> rem(@mod)
    b = 1..b |> Enum.sum() |> rem(@mod)
    c = 1..c |> Enum.sum() |> rem(@mod)
 
    ans = rem(a * b, @mod)
    ans = rem(ans * c, @mod)
    ans |> IO.puts()

余りをとる系はいまいちどこでとればいいのかまだよくわからない。。。

B - Quadruple

a+b−c−d=K のままだと変数が4つあってつらいので、まずは変数2つで考えることにした。

A - C = K

このとき K については 絶対値 で考えてもいいはず。 (Kがマイナスのときは C - A = K と同じだから)

このとき A > C > 0 なので、 A について K+2..2N の範囲で見ていけば、 C = A - K でCも決定できる。

あとはA, C それぞれについて変数2つ使った組み合わせを考える。
整数xになる変数2つ使った組み合わせは0を含まないので、 n - 1 通りになる

参考: 【応用】指定した合計値になる整数の組合せ

今回は更に使える数が n までになるので、xとnの差の組み合わせを引いてあげればOK

  def main() do
    [n, k] = read_array()
    k = abs(k)
    (for a <- (2 * n)..(k + 2), do: p(a, n) * p(a - k, n))
    |> Enum.sum()
    |> IO.inspect()

  end

  def p(n, k) do
    s = (n - k - 1)
    s = if s > 0, do: s, else: 0
    (n - 1) - (s * 2)
  end