zoukankan      html  css  js  c++  java
  • P1350 车的放置 思维 排列组合

    P1350 车的放置 思维 排列组合

    题意

    有下面这样的一个网格棋盘,(a,b,c,d) 表示了对应边长度,也就是对应格子数:

    img

    要在这个棋盘上放 (k) 个相互不攻击的车,也就是这 (k) 个车没有两个车在同一行,也没有两个车在同一列,问有多少种方案。

    [0leq a,b,c,d,kleq 10^3 ]

    分析

    如果想到了就很简单,(当然此题DP也很简单),把这个多边形分成上下两个区域,枚举放置车的个数,排列组合即可。

    当上面的车数是(x) 个时,上面的方案数就是(A_a^xcdot C_b^x) ,下面的方案数(C_d^{k-x}cdot A_{a+c-x}^{k-x}) ,相乘就是答案(这里注意一下不要漏掉排列)

    代码

    ll C[2005][2005];
    ll fac[2005];
    void get_C() {
        C[0][0] = 1;
        for (int i = 1; i < 2003; i++) {
            C[i][0] = 1;
            for (int j = 1; j <= i; j++)
                C[i][j] = C[i - 1][j] + C[i - 1][j - 1], C[i][j] %= MOD;
        }
        fac[0] = 1;
        for (int i = 1; i < 2003; i++) fac[i] = fac[i - 1] * i, fac[i] %= MOD;
    }
    
    
    int main() {
        get_C();
        int a, b, c, d, k;
        a = readint();
        b = readint();
        c = readint();
        d = readint();
        k = readint();
        ll res = 0;
        for (int i = 0; i <= k; i++) {
            ll now = 1;
            if (i > b || i > a || k - i > d || k - i > a + c - i) continue;
            now *= C[b][i], now %= MOD;
            now *= C[a][i] * fac[i], now %= MOD;
            now *= C[d][k - i], now %= MOD;
            now *= C[a + c - i][k - i ] * fac[k - i], now %= MOD;
            res += now;
            res %= MOD;
        }
        Put(res);
    }
    
  • 相关阅读:
    C#基础知识简单梳理
    knearest neighbor
    二叉查找树的实现
    Unix/Linux 那些系统启动后的进程
    Nginx反向代理IIS
    线程漫谈——线程同步之信号量和互斥量
    BtxCMS@B.T.X 项目及界面展示 [下载]
    MVC in MFC or WTL
    HTTP HTTPS WebService
    ASP.NET WebAPI RC 竟然不支持最常用的json传参
  • 原文地址:https://www.cnblogs.com/hznumqf/p/13556954.html
Copyright © 2011-2022 走看看