hdu 4779 Tower Defense (思维+组合数学)
Tower Defense
However, in most Tower Defense games, your defending towers will not attack each other. You will see the shells flying through your towers and finally hit the target on your screen. DRD thinks it to be absurd, and he designed a new tower defense game.
In DRD’s game, you have two kinds of defending tower, heavy tower and light tower. You can put the tower on a grid with N rows and M columns and each cell in the grid can hold one tower at most. Both two kinds of towers can attack the cells in the same column
or the same row as it is located in, and your towers may attack each other. Moreover, light towers should not be attacked by other towers while heavy towers can be attacked by at most one other tower.
You can put some of your towers (at least one tower) in the grid to build a tower formation satisfying the restriction above. And now, DRD wants you to calculate that how many different tower formations could be designed. Note that all the towers of the same
type are considered to be identical. While the answer could be quite large, you should output the number mod (109 + 7).
For each test case, there is only one line containing 4 integers, N, M, P and Q ,meaning that the grid has N rows and M columns, and you have P heavy towers and Q light towers. You do not have to put all the towers in the grid. (1 <= N, M <= 200, 0 <= P,
Q <= 200)
3
2 2 0 1
2 2 2 0
3 3 2 1
4
10
144
每种塔,能攻击他所在的一行和他所在的一列, 轻塔不 能被攻击。而重塔能够被至多一个塔攻击,也就是说重塔仅仅能被重塔攻击。
在一个n*m 的矩阵中,最少放一个塔,可放多个。
问。给定p个重塔,q个轻塔。问有多少种放法。
2、 一列中有两个重塔
3、 在该行及在该行塔所在的列仅仅有一个塔,重塔或者轻塔。
对以上三种情况挨个处理:
1、 设有i行有两个重塔,j列有两个重塔,则一共占 i+2*j 行, j+2*i列,共用2*(i+j)个重塔,,由于一行或一列两个塔
2、 对剩余的塔,进行枚举,0<-->剩余的塔。枚举这些塔中重塔的个数进行枚举
对于2:设有k个塔, 在剩余的n-(i+2*j) 行 m-(2*i+j) 列中 选 k个 点 (现有的行列组合*k!),k最大为 p-2*(i+j)+q,对于k个塔,则重塔最多有b = min (k, p-2*(i+j) ) 个, 最少有a = max(0,k-q) 个 。k个塔,最少 a 。最多b 则为重塔的取法有(c[k][0]+c[k][1]...+c[k][b])- (c[k][0]+c[k][1]+...+c[k][a-1]);
最后将不放的情况减掉就可以,也就是减1;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#define maxn 405
#define MAXN 200005
#define INF 0x3f3f3f3f
#define mod 1000000007
#define eps 1e-6
const double pi=acos(-1.0);
typedef long long ll;
using namespace std; ll n,m,ans,cnt,p,q;
ll c[maxn][maxn],sum[maxn][maxn],fac[maxn],odd[maxn]; void presolve()
{
ll i,j;
for(i=0;i<=200;i++) c[i][0]=sum[i][0]=1;
for(i=1;i<=200;i++)
{
for(j=1;j<=i;j++)
{
c[i][j]=c[i-1][j]+c[i-1][j-1];
c[i][j]%=mod;
}
}
for(i=0;i<=200;i++)
{
for(j=1;j<=200;j++)
{
sum[i][j]=sum[i][j-1]+c[i][j];
sum[i][j]%=mod;
}
}
fac[0]=odd[1]=1;
for(i=1;i<=400;i++)
{
fac[i]=(fac[i-1]*i)%mod;
if(i>1&&(i&1)) odd[i]=(odd[i-2]*i)%mod;
}
}
void solve()
{
ll i,j,t,k;
ans=0;
for(i=0; i<=n; i++)
{
for(j=0; j<=m; j++)
{
if(i+2*j>n||(j+2*i)>m||2*(i+j)>p) break ;
if(2*i-1>0) t=odd[2*i-1];
else t=1;
ll res=(((((c[n][i]*c[m][2*i])%mod)*t)%mod)*fac[i])%mod;
if(2*j-1>0) t=odd[2*j-1];
else t=1;
res=((((res*c[m-2*i][j])%mod*c[n-i][2*j])%mod*t)%mod*fac[j])%mod; ll tp=p-2*(i+j),tq=q,tn=n-(i+2*j),tm=m-(j+2*i);
for(k=0;k<=tp+tq;k++)
{
if(k>tn||k>tm) break ;
ll minp=max(0LL,k-tq),maxp=min(k,tp);
if(minp==0) t=0;
else t=sum[k][minp-1];
ll tmp=((((c[tn][k]*c[tm][k])%mod*fac[k])%mod)*(sum[k][maxp]-t))%mod;
ans=(ans+tmp*res)%mod;
}
}
}
ans=(ans-1+mod)%mod;
printf("%lld\n",ans);
}
int main()
{
ll i,j,t;
presolve();
scanf("%lld",&t);
while(t--)
{
scanf("%lld%lld%lld%lld",&n,&m,&p,&q);
solve();
}
return 0;
}
/*
3
2 2 0 1
2 2 2 0
3 3 2 1
*/
hdu 4779 Tower Defense (思维+组合数学)的更多相关文章
- hdu 4779 Tower Defense 2013杭州现场赛
/** 题意: 有两种塔,重塔,轻塔.每种塔,能攻击他所在的一行和他所在的一列, 轻塔不 能被攻击,而重塔可以被至多一个塔攻击,也就是说重塔只能被重塔攻击.在一个n*m 的矩阵中,最少放一个塔,可放多 ...
- 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 ...
- HDU 4939 Stupid Tower Defense(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4939 解题报告:一条长度为n的线路,路上的每个单元格可以部署三种塔来给走在这条路上的敌人造成伤害,第一 ...
随机推荐
- php curl 抓取
<?php set_time_limit(0); function curl_multi($urls) { if (!is_array($urls) or count($urls) == 0) ...
- 计蒜之道 初赛 第三场 题解 Manacher o(n)求最长公共回文串 线段树
腾讯手机地图 腾讯手机地图的定位功能用到了用户手机的多种信号,这当中有的信号的作用范围近.有的信号作用的范围则远一些.有的信号相对于用户在不同的方位强度是不同的,有的则是在不论什么一个方向上信号强度都 ...
- [mark]如何删除地址栏的记录?
比如,我输入字母a ..因为经常访问.它首先会自动帮我补填 amazon.cn 第二行出现 ali213...第三行是 alipay... 这个很简单,没必要搞得很复杂很Geek.比如楼主的情况,首先 ...
- 【前台】【单页跳转】整个项目实现单页面跳转,抛弃iframe
即如下: [想做到点击nav侧边栏,仅替换右边div中的内容,而不是跳转到新的页面,这样的话,其实整个项目中就只有一个完整的页面,其他的页面均只写<body>内的部分即可,或者仅仅写要替换 ...
- php 将网页执行的输出写入到本地文件中
php -f /var/www/html/default/script/lol_score_calculate/calculate.php >>score_calcutelate.log
- Python学习 —— 阶段综合练习二
综合之前的类的学习,做以下实例练习:(建议先不要看代码,自己先试着写:代码仅供参考,有多种实现方法) 1. Triangle & Equilateral 1). 创建class Triang ...
- openssl https 单向认证连接成功示例
研究这个玩意也有几天的时间了,刚学C 因为不熟悉编译折腾了不少时间,终于弄通了,发个随笔给研究openssl https的同学一点提示吧. 环境: ========================== ...
- 关于一道面试题,使用C#实现字符串反转算法
关于一道面试题,使用C#实现字符串反转算法. 题目见http://student.csdn.net/space.php?do=question&ac=detail&qid=490 详细 ...
- 如何在Windows Server 2012 R2上安装SharePoint 2013
笔者原以为是个挺容易个事儿, 毕竟是微软自家的产品安装在自家的操作系统上, 没想到还是让我费了半天劲. 写在这里吧, 方便其他的朋友. 具体步骤 ======================= ...
- Packagist / Composer 中国全量镜像
用法: 有两种方式启用本镜像服务: 将配置信息添加到 Composer 的配置文件 config.json 中(系统全局配置).见“例1 (推荐方式)” 将配置信息添加到单个项目的 composer. ...