提出 #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 | ||||
| 結果 |
|
|
| セット名 | テストケース |
|---|---|
| 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 |