Submission #67827976
Source Code Expand
import * as fs from 'fs';
const MOD = 1000000007n; // 10^9 + 7 を BigInt で定義
const MAX = 200000; // H + W の最大をカバー(制約: H, W ≤ 100000)
let fact: bigint[] = [];
let invFact: bigint[] = [];
/**
* base^exp % MOD を返す関数(高速累乗、繰り返し二乗法)
* @param base 底(BigInt)
* @param exp 指数(BigInt)
* @returns 累乗結果 base^exp mod MOD
*/
function modPow(base: bigint, exp: bigint): bigint {
let result = 1n;
base %= MOD;
while (exp > 0n) {
if (exp % 2n === 1n) result = (result * base) % MOD;
base = (base * base) % MOD;
exp >>= 1n;
}
return result;
}
/**
* 階乗と逆元の前計算
* 計算結果を global な fact[], invFact[] に格納
*/
function precomputeFactorials(): void {
fact = Array(MAX + 1);
invFact = Array(MAX + 1);
fact[0] = 1n;
for (let i = 1; i <= MAX; i++) {
fact[i] = (fact[i - 1] * BigInt(i)) % MOD;
}
invFact[MAX] = modPow(fact[MAX], MOD - 2n); // フェルマーの小定理による逆元
for (let i = MAX - 1; i >= 0; i--) {
invFact[i] = (invFact[i + 1] * BigInt(i + 1)) % MOD;
}
}
/**
* 組み合わせ nCr を MOD で計算
* @param n 全体の数(0 <= r <= n <= MAX)
* @param r 選ぶ数
* @returns nCr % MOD の値(BigInt)
*/
function combination(n: number, r: number): bigint {
if (r < 0 || r > n) return 0n;
return (fact[n] * invFact[r] % MOD) * invFact[n - r] % MOD;
}
/**
* 入力に基づき格子経路数を計算する
* @param input 標準入力から読み込んだ文字列("H W")
* @returns 経路数(BigInt)
*/
function calculateGridPaths(input: string): bigint {
const [H, W] = input.trim().split(/\s+/).map(Number);
precomputeFactorials(); // 階乗と逆元の前計算
const totalSteps = H + W - 2;
const downSteps = H - 1;
return combination(totalSteps, downSteps); // C(H+W-2, H-1)
}
// 標準入力から読み込み & 実行
const input = fs.readFileSync('/dev/stdin', 'utf-8');
console.log(calculateGridPaths(input).toString());
Submission Info
| Submission Time | |
|---|---|
| Task | B30 - Combination 2 |
| User | myoshizumi |
| Language | TypeScript 5.1 (Node.js 18.16.1) |
| Score | 1000 |
| Code Size | 2121 Byte |
| Status | AC |
| Exec Time | 121 ms |
| Memory | 74100 KiB |
Compile Error
Judge Result
| Set Name | Sample | All | ||||
|---|---|---|---|---|---|---|
| Score / Max Score | 0 / 0 | 1000 / 1000 | ||||
| Status |
|
|
| Set Name | Test Cases |
|---|---|
| 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 |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| sample_01.txt | AC | 120 ms | 74048 KiB |
| sample_02.txt | AC | 120 ms | 74028 KiB |
| sample_03.txt | AC | 119 ms | 74048 KiB |
| test_01.txt | AC | 120 ms | 73920 KiB |
| test_02.txt | AC | 121 ms | 74000 KiB |
| test_03.txt | AC | 119 ms | 74100 KiB |
| test_04.txt | AC | 120 ms | 74068 KiB |
| test_05.txt | AC | 120 ms | 74092 KiB |
| test_06.txt | AC | 119 ms | 74088 KiB |
| test_07.txt | AC | 119 ms | 74068 KiB |
| test_08.txt | AC | 120 ms | 74048 KiB |