1. paizaラーニングトップ
  2. レベルアップ問題集
  3. 多次元DPメニュー(言語選択)
  4. 問題一覧 JavaScript編
  5. グリッド上の互いに素な移動 JavaScript編

多次元DPメニューのサムネイル
グリッド上の互いに素な移動 JavaScript編(paizaランク B 相当)

問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!

問題

下記の問題をプログラミングしてみよう!

h × w のグリッドがあり、このグリッドの上から i 行目、左から j 列目のセルを (i, j) と呼ぶことにします。(1 ≦ i ≦ h, 1 ≦ j ≦ w)
あなたは最初に (1, 1) にいて、ちょうど k 回の移動で (h, w) にたどりつきたいと考えています。
ただし、移動は以下の条件を満たさなければなりません。

・ (i, j) から (i + dx, j + dy) に移動できるのは、gcd(dx, dy) = 1 であるとき、かつそのときに限る
・ ここで、gcd(x, y) は x と y の最大公約数とする
・ dx, dy は整数で、(dx, dy) ≠ (0, 0) を満たす (負でもよいことに注意)
・ グリッドの外に出るような移動はできない

以上の条件を満たすような経路の個数を求めてください。
ただし、経路 p は p = ((x_0, y_0), (x_1, y_1), ..., (x_k, y_k)) として表現され、
(x_0, y_0) = (1, 1)、(x_k, y_k) = (h, w) を満たします。
2 つの経路はその表現が異なる場合に別々の経路としてカウントするものとします。

答えは非常に大きくなる可能性があるため、10^9 で割った余りを出力してください。

入力される値

h w k

・ 1 行目に、グリッドのサイズを表す整数 h, w と整数 k が半角スペース区切りで与えられます。


入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。 標準入力からの値取得方法はこちらをご確認ください
期待する出力

1 行で、答えを 10^9 で割った余りを整数で出力してください。

また、末尾に改行を入れ、余計な文字を含んではいけません。

条件

すべてのテストケースにおいて、以下の条件をみたします。

・ 入力はすべて整数
・ 1 ≦ h, w, k ≦ 30

入力例1

3 3 2

出力例1

5

入力例2

2 2 4

出力例2

20

問題一覧へ戻る

ページの先頭へ戻る