0w1

ABC 034 C - 経路 ( Math )

C: 経路 - AtCoder Beginner Contest 034 | AtCoder
前はDPにこだわりすぎてとけなかった。でもよく考えると実は H + W - 2 の選択から H - 1 ( あるいは W - 1 ) 個を選ぶだけの事。factorial と mod_inv で終わり。

const int MOD = 1e9 + 7;

int int_pow( int x, int p ){
    int res = 1;
    while( p ){
        if( p & 1 ) res = 1LL * res * x % MOD;
        x = 1LL * x * x % MOD;
        p >>= 1;
    }
    return res;
}

int mod_inv( int x ){
    return int_pow( x, MOD - 2 );
}

void solve(){
    int W, H; cin >> W >> H;
    vi fact( W + H );
    fact[ 0 ] = 1;
    for( int i = 0; i + 1 < fact.size(); ++i )
        fact[ i + 1 ] = 1LL * fact[ i ] * ( i + 1 ) % MOD;
    int ans = 1LL * fact[ W + H - 2 ] * mod_inv( fact[ W - 1 ] ) % MOD * mod_inv( fact[ H - 1 ] ) % MOD;
    cout << ans << "\n";
}