原文链接https://www.cnblogs.com/zhouzhendong/p/HDU4779.html

题目传送门 - HDU4779

题意

  $T$ 组数据。

  给定一个 $n\times m$ 的棋盘,要在上面放最多 $P$ 个重塔和最多 $Q$ 个轻塔。

  每一个塔都会攻击同行和同列的塔。轻塔不能承受任何攻击。重塔最多可以承受一个塔的攻击。

  所有重塔全是一样的,所有轻塔也是一样的,但是重塔和轻塔不同。

  现在问你有多少放置塔(至少放一个塔)的方案。答案对于 $1e9+7$ 取模。

  $1\leq T,n,m,P,Q\leq 200$

题解

  听说这一题 Cyanic 读错两次题意还出了一道毒瘤题给我们阿掉他的机会??

  我们写考虑枚举有两个重塔的行和列的个数。

  假设上面的两个量分别为 $i$ 和 $j$ 。

  则剩余行数和列数分别为 $n-i-2j$ 和 $m-2i-j$ ,剩余重塔个数为 $P-2i-2j$ 。

  我们可以预处理 $dp_{i}{j}$ 为在 $i$ 个行或列中选择 $j$ 对 行或列 的方案数。

  则显然答案为 $\binom{i}{2j}\ \ \ \ \ \ \ \ \times \ \ \ \ \ \ \ \ (2j)! \ \ \ \ \ \ \ \ ÷ \ \ \ \ \ \ \ \ 2^{j}$

  表示的意义: $i$ 行选 $2j$ 行    全排列     并依次选择每一对行或列     每一对行或列都有两种排列方式,总共被算了 $2^{j}$ 次,要除掉。

  然后枚举在剩余的 $n-i-2j$ 行和 $m-2i-j$ 列中放多少个塔。

  需要预处理一下组合数的前缀和。

  然后可以用组合数算出当前情况对答案的贡献。具体自己看代码吧。这里不展开赘述。

  注意一下,要特判掉不放塔的情况。

代码

#include <bits/stdc++.h>
using namespace std;
const int N=405,mod=1e9+7;
int T,n,m,P,Q;
int C[N][N],Fac[N],Pow[N],s[N][N],dp[N][N];
int main(){
Fac[0]=Pow[0]=1;
for (int i=0;i<N;i++)
C[i][0]=s[i][0]=1;
for (int i=1;i<N;i++)
Fac[i]=1LL*Fac[i-1]*i%mod,Pow[i]=1LL*Pow[i-1]*500000004%mod;
for (int i=1;i<N;i++)
for (int j=1;j<=i;j++){
C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
s[i][j]=(s[i][j-1]+C[i][j])%mod;
}
for (int i=0;i<N/2;i++)
for (int j=0;j<N/2;j++)
dp[i][j]=1LL*C[i][j*2]*Fac[2*j]%mod*Pow[j]%mod;
scanf("%d",&T);
while (T--){
scanf("%d%d%d%d",&n,&m,&P,&Q);
int ans=0;
for (int r=0;r*2<=m;r++)
for (int c=0;c*2<=n;c++){
int RR=n-c*2-r,CC=m-r*2-c,p=P-r*2-c*2;
if (RR<0||CC<0||p<0)
continue;
int mi=min(RR,CC),ma=max(RR,CC);
int Mul=1LL*C[n-2*c][r]%mod*C[m-2*r][c]%mod*dp[m][r]%mod*dp[n][c]%mod;
int tot=0,lim=min(mi,p+Q);
for (int i=0;i<=lim;i++){
int M2=s[i][min(p,i)];
if (max(i-Q,0)-1>=0)
M2=(M2-s[i][max(i-Q,0)-1]+mod)%mod;
if (r||c||i)
tot=(1LL*M2*C[ma][i]%mod*C[mi][i]%mod*Fac[i]+tot)%mod;
}
ans=(1LL*Mul*tot+ans)%mod;
}
printf("%d\n",ans);
}
return 0;
}

  

HDU4779 Tower Defense 组合数学的更多相关文章

  1. hdu 4779 Tower Defense (思维+组合数学)

    Tower Defense Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) ...

  2. HDU 4779:Tower Defense

    Tower Defense Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)T ...

  3. dp --- hdu 4939 : Stupid Tower Defense

    Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/ ...

  4. hdu4939 Stupid Tower Defense (DP)

    2014多校7 第二水的题 4939 Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131 ...

  5. Stupid Tower Defense

    Problem Description FSF is addicted to a stupid tower defense game. The goal of tower defense games ...

  6. 初识Tower Defense Toolkit

    Tower Defense Toolkit 做塔防游戏的插件 主要层次如下图: 1GameControl _ _Game Control(Script) _ _ _Spawn Manager _ _ ...

  7. HDU4939Stupid Tower Defense (有思想的dp)

    Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Oth ...

  8. Tower Defense Game

    Tower Defense Game 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 There is a tower defense game with n level ...

  9. hihoCoder #1199 : Tower Defense Game ——(树型dp)

    题目链接:https://hihocoder.com/problemset/problem/1199. 题意:一棵以1为根的树,每个点有一个p值和q值,到这个点需要当前分数大于等于p,然后消耗掉(p- ...

随机推荐

  1. SSM框架应用

    一.更新用户密码功能的实现 1. 新建页面 profile.jsp,添加三个输入框和提交按钮:用户输入当前密码.输入新密码.再次确认密码和重置按钮.修改密码按钮: 2. 前台 js(JavaScrip ...

  2. 整理oracle 树形查询

    注:本文参考了<整理oracle 树形查询> sql树形递归查询是数据库查询的一种特殊情形,也是组织结构.行政区划查询的一种最常用的的情形之一.下面对该种查询进行一些总结: create ...

  3. Confluence 6 为翻译显示用户界面的键(Key)名称

    这个功能在你使用 Confluence 用户界面为 Confluence 创建翻译的时候会非常有用.当你打开主面板的时候,在你访问的 URL 的最后面添加下面的文字:can add the follo ...

  4. Confluence 6 连接到外部用户目录服务器的问题分析

    在有关外部目录服务器配置页面中有一个测试配置(Test Settings)按钮.这个功能将会帮助你分析你的用户管理在 Active Directory 和其他 LDAP 服务器中出现的问题. 希望对你 ...

  5. Confluence 6 用户目录图例 - 和 Jira 连接到 Crowd

      上面的图:Confluence, JIRA 和其他应用程序连接到 Crowd 作为用户管理. https://www.cwiki.us/display/CONF6EN/User+Managemen ...

  6. vi 编辑器常用快捷键

    vi 编辑器 vim 编辑器算是vi的进阶版本 所有的unix like 系统都会内建vi编辑器 vi三种模式分别为: 1.一般模式(默认模式或指令模式) 上下左右方向键 移动光标 pageUp pa ...

  7. 【mysql】datetime时间比较

    如下,比较的日期用指定格式写出就可以了.不需要日期函数. SELECT * FROM table_a WHERE write_date > "2017-07-17 00:00:00&q ...

  8. DSB

    Linux day01 计算机硬件知识整理 作业要求:整理博客,内容如下 编程语言的作用及与操作系统和硬件的关系 应用程序->操作系统->硬件 cpu->内存->磁盘 cpu与 ...

  9. jsp 修饰 Request 及Response

    Servlet API包含4个可修饰的类,用于改变Servlet Request以及Servlet Response.这种修饰允许修改 ServletRequest以及ServletResponse或 ...

  10. WireShark Wifi认证数据包分析(论文idea)

    1.使用 wireShark捕获802.11数据帧结构分成三种,管理帧.控制帧.数据帧. 使用的过滤语法: 过滤MAC 地址: Waln.bssid eq=8c:23:0c:44:21:0f 过滤特定 ...