提出 #67828372


ソースコード 拡げる

<?php

const MOD = 1000000007;
const MAX = 200000; // H + W の最大が 200000 まで対応可能

/**
 * @var array<int> $fact    階乗テーブル fact[n] = n! mod MOD
 * @var array<int> $invFact 逆元テーブル invFact[n] = (n!)^(-1) mod MOD
 */
$fact = array_fill(0, MAX + 1, 1);
$invFact = array_fill(0, MAX + 1, 1);

/**
 * 累乗を MOD で計算する(繰り返し二乗法)
 *
 * @param int $base 底
 * @param int $exp 指数
 * @return int base^exp % MOD
 */
function mod_pow(int $base, int $exp): int {
    $result = 1;
    $base %= MOD;

    while ($exp > 0) {
        if ($exp % 2 === 1) {
            $result = ($result * $base) % MOD;
        }
        $base = ($base * $base) % MOD;
        $exp = intdiv($exp, 2);
    }

    return $result;
}

/**
 * 階乗と逆元を事前計算
 *
 * @global array<int> $fact
 * @global array<int> $invFact
 * @return void
 */
function precompute_factorials(): void {
    global $fact, $invFact;

    for ($i = 1; $i <= MAX; $i++) {
        $fact[$i] = ($fact[$i - 1] * $i) % MOD;
    }

    $invFact[MAX] = mod_pow($fact[MAX], MOD - 2);
    for ($i = MAX - 1; $i >= 0; $i--) {
        $invFact[$i] = ($invFact[$i + 1] * ($i + 1)) % MOD;
    }
}

/**
 * nCr % MOD を返す
 *
 * @param int $n
 * @param int $r
 * @return int nCr mod MOD
 */
function combination(int $n, int $r): int {
    global $fact, $invFact;

    if ($r < 0 || $r > $n) {
        return 0;
    }

    return (int)((($fact[$n] * $invFact[$r]) % MOD) * $invFact[$n - $r] % MOD);
}

/**
 * 格子経路数を求める関数
 *
 * @param int $H 行数
 * @param int $W 列数
 * @return int 経路数(mod 1e9+7)
 */
function count_grid_paths(int $H, int $W): int {
    precompute_factorials();
    return combination($H + $W - 2, $H - 1);
}

/**
 * メイン処理:標準入力を読み取り、結果を出力
 */
function main(): void {
    [$H, $W] = array_map('intval', explode(' ', trim(fgets(STDIN))));
    echo count_grid_paths($H, $W) . PHP_EOL;
}

main();

提出情報

提出日時
問題 B30 - Combination 2
ユーザ myoshizumi
言語 PHP (php 8.2.8)
得点 1000
コード長 2095 Byte
結果 AC
実行時間 25 ms
メモリ 27708 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 1000 / 1000
結果
AC × 3
AC × 11
セット名 テストケース
Sample sample_01.txt, sample_02.txt, sample_03.txt
All sample_01.txt, sample_02.txt, sample_03.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt
ケース名 結果 実行時間 メモリ
sample_01.txt AC 24 ms 27212 KiB
sample_02.txt AC 25 ms 27136 KiB
sample_03.txt AC 24 ms 27048 KiB
test_01.txt AC 23 ms 26996 KiB
test_02.txt AC 23 ms 26876 KiB
test_03.txt AC 23 ms 27144 KiB
test_04.txt AC 23 ms 27024 KiB
test_05.txt AC 23 ms 27136 KiB
test_06.txt AC 24 ms 27248 KiB
test_07.txt AC 25 ms 27704 KiB
test_08.txt AC 20 ms 27708 KiB