HDU4779 Tower Defense 组合数学
原文链接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 组合数学的更多相关文章
- hdu 4779 Tower Defense (思维+组合数学)
Tower Defense Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) ...
- HDU 4779:Tower Defense
Tower Defense Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)T ...
- dp --- hdu 4939 : Stupid Tower Defense
Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/ ...
- hdu4939 Stupid Tower Defense (DP)
2014多校7 第二水的题 4939 Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131 ...
- Stupid Tower Defense
Problem Description FSF is addicted to a stupid tower defense game. The goal of tower defense games ...
- 初识Tower Defense Toolkit
Tower Defense Toolkit 做塔防游戏的插件 主要层次如下图: 1GameControl _ _Game Control(Script) _ _ _Spawn Manager _ _ ...
- HDU4939Stupid Tower Defense (有思想的dp)
Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Oth ...
- Tower Defense Game
Tower Defense Game 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 There is a tower defense game with n level ...
- hihoCoder #1199 : Tower Defense Game ——(树型dp)
题目链接:https://hihocoder.com/problemset/problem/1199. 题意:一棵以1为根的树,每个点有一个p值和q值,到这个点需要当前分数大于等于p,然后消耗掉(p- ...
随机推荐
- 压缩JS的eclipse插件
主页:http://jscompressor.oncereply.me/ Update site: http://jscompressor.oncereply.me/update/
- ASP.NET MVC5高级编程 之 Ajax
jQuery不仅支持所有现代浏览器,包括IE.Firefox.Safari.Opera和Chrome等,还可以在编写代码和浏览器API冲突时隐藏不一致性(和错误). 1. jQuery jQuery擅 ...
- C# 后台请求api
/// <summary> /// 指定Post地址使用Get 方式获取全部字符串 /// </summary> /// <param name="url&qu ...
- 洛谷P4389 付公主的背包 [生成函数,NTT]
传送门 同样是回过头来发现不会做了,要加深一下记忆. 思路 只要听说过生成函数的人相信第一眼都可以想到生成函数. 所以我们要求 \[ ans=\prod \sum_n x^{nV}=\prod \fr ...
- Codeforces 1093E Intersection of Permutations [CDQ分治]
洛谷 Codeforces 思路 一开始想到莫队+bitset,发现要T. 再想到分块+bitset,脑子一抽竟然直接开始写了,当然也T了. 最后发现这就是个裸的CDQ分治-- 发现\(a\)不变,可 ...
- swift 实践- 05 -- UITextField
import UIKit class ViewController: UIViewController ,UITextFieldDelegate{ // 文本框的创建, 有如下几个样式: // UIT ...
- Confluence 6 配置白名单
Confluence 管理员可以通过添加 URLs 到白名单选择出入的链接和使用 RSS 宏,HTML 包含宏和小工具中的内容. 如果一个内容被添加到 Confluence 系统中,但是这个 URLs ...
- Confluence 6 XML 备份失败的问题解决
XML 站点备份仅仅被用于整合到一个新的数据库.设置一个测试服务器 或者 创建一个可用的备份策略 相对 XML 备份来说是更合适的策略. 相关页面: Enabling detailed SQL log ...
- linux下命令窗口中$和#的区别
$表示现在的用户是普通用户#表示现在的用户是root用户 # 代表你能做任何事$ 代表你能做一些/下和/home目录的所有事
- Tomcat解决中文乱码并部署项目
1.在Tomcat下的server.xml中添加URIEncoding="UTF-8"(解决中文乱码的问题) 2.在Tomcat下的server.xml中添加<Context ...