码迷,mamicode.com
首页 > 其他好文 > 详细

[CF128C] Games with Rectangle - 组合

时间:2021-03-05 12:56:45      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:signed   有一个   构造   lan   组合   F12   def   line   const   

[CF128C] Games with Rectangle - 组合

Description

一个棋盘上有一个大小为n*m的矩阵,矩阵边缘在棋盘线上.现在你要操作k次,每一次都在上一个画好的矩阵中再画一个矩阵,要求被严格包含,边缘也不能重叠且必须在棋盘线上.问你一共有几种画法.

Solution

一种暴力的想法是,设 \(f[t][i][j]\) 表示走了 t 步,画出 \(i \times j\) 的矩形的方案数

发现横向和纵向是相互独立的,所以我们分开来考虑

\(f[i][j]\) 表示走了 i 步,长度为 j 的方案数

行列分别算,然后乘起来即可

从小往大画和从大往小画是等价的,所以我们考虑从小往大走,这样只需要跑一遍


仔细想想,其实就是构造一个单调 2-减小的序列,所以本质上是个组合问题

从 n-1 中选出 2k 个作为线段的端点

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

#define int long long

const int mod = 1e9 + 7;

int qpow(int p, int q)
{
    return (q & 1 ? p : 1) * (q ? qpow(p * p % mod, q / 2) : 1) % mod;
}

int inv(int p)
{
    return qpow(p, mod - 2);
}

int fac(int p)
{
    if (p == 0)
        return 1;
    return p * fac(p - 1) % mod;
}

int ncr(int n, int r)
{
    if (r < 0 || r > n)
        return 0;
    return fac(n) * inv(fac(r)) % mod * inv(fac(n - r)) % mod;
}

signed main()
{
    ios::sync_with_stdio(false);

    int n, m, k;
    cin >> n >> m >> k;

    cout << ncr(n - 1, k * 2) * ncr(m - 1, k * 2) % mod << endl;
}

[CF128C] Games with Rectangle - 组合

标签:signed   有一个   构造   lan   组合   F12   def   line   const   

原文地址:https://www.cnblogs.com/mollnn/p/14480137.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!