0w1

CFR 128 C. Games with Rectangle ( Math )

Problem - 128C - Codeforces

題意:
給一個 N * M 的矩形。現在要做 K 次操作,每次需將原本的矩形嚴格變小,但必須邊長都是整數。問方案數對 1e9 + 7 取模。

資料規模:
1 ≤ N, M, K ≤ 1000

解法:
二維問題很常有的一個技巧,那就是發現兩個維度獨立。
考慮一維問題,那便是在 N - 1 條縱線中選取 2 * K 條線,左右界便會唯一確定。
分別計算後相乘即可。

時間 / 空間複雜度:
O( N^2 )

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1000;
const int MOD = ( int ) 1e9 + 7;

int C[ MAXN + 10 ][ MAXN + 10 ];
int N, M, K;

signed main(){
  {
    C[ 0 ][ 0 ] = 1;
    for( int i = 0; i < MAXN; ++i ){
      for( int j = 0; j <= i; ++j ){
        ( C[ i + 1 ][ j ] += C[ i ][ j ] ) %= MOD;
        ( C[ i + 1 ][ j + 1 ] += C[ i ][ j ] ) %= MOD;
      }
    }
  }
  ios::sync_with_stdio( 0 );
  cin >> N >> M >> K;
  if( 2 * K > N - 1 or 2 * K > M - 1 ){
    cout << 0 << endl;
  } else{
    cout << 1LL * C[ N - 1 ][ 2 * K ] * C[ M - 1 ][ 2 * K ] % MOD << endl;
  }
  return 0;
}