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的线路,路上的每个单元格可以部署三种塔来给走在这条路上的敌人造成伤害,第一 ...
随机推荐
- 【资料】wod书籍
世界掉落 特点 风化的书卷 可用三次的无限耗材 华丽的书卷 可用5次 无限耗材 队伍唯一 抄录页:新手躲避 近远防御 +34%X技能等级 风化的书卷:新手躲避 华丽的书卷:新手躲避 抄录页:高级闪避技 ...
- infor系统日常问题解决笔记
1.问题:结算单核准时候显示订单XXX的状态为已修改. 解决方法:在采购订单状态栏重新核准订单,采购订单状态不影响发票核准,结算后不允许再新增采购订单行,否则仍然会提示采购订单状态为已修改,且无法进行 ...
- FAQ:枚举和常规的值,到底哪种更符合程序使用?
问: 枚举和常规的值,到底哪种更符合程序使用? 答: 肯定是根据不同的场景,做出不同的选择. 如果是不同的值需要不同的逻辑,肯定是枚举好一些.如果只是表示某个取值范围且这个范围会动态变化,用常规的值 ...
- SQL中关于where后面不能放聚合函数(如sum等)的解决办法
我们在编写较为复杂的SQL语句的时候,常常会遇到需要将sum()放到where后面作为条件查询,事实证明这样是无法执行的,执行会报[此处不允许使用分组函数]异常. 那么如何解决呢,使用HAVING关键 ...
- poj 3258 River Hopscotch 题解
[题意] 牛要到河对岸,在与河岸垂直的一条线上,河中有N块石头,给定河岸宽度L,以及每一块石头离牛所在河岸的距离, 现在去掉M块石头,要求去掉M块石头后,剩下的石头之间以及石头与河岸的最小距离的最大值 ...
- MySQL模糊查询(like)时区分大小写
问题说明:通过上面的语句,你会发现MySQL的like查询是不区分大小写的,因为我的失误,把Joe写成了joe才发现了这个东东吧.但是,有时候,我们需要区分大小写的是,该怎么办呢?解决方法如下: 方法 ...
- BeagleBone折腾记(一):连接你的狗板
BeagleBone折腾记一连接你的狗板 准备 了解BeagleBone BeagleBone社区 所需软硬件 USB连接 TTL连接 结语 准备 了解BeagleBone BeagleBone可能一 ...
- Informatica 常用组件Source Qualifier之四 SQL Query
源限定符转换提供 SQL 查询选项以覆盖默认的查询.您可以输入您的源数据库支持的 SQL 语句.输入查询之前,请连接您要在映射中使用的所有输入和输出端口. 编辑 SQL 查询时,您可以生成并编辑默认查 ...
- 突破IP限制登入网站后台
后台: http://www.zhuna.cn/sys_admin/ 输入账号密码 点击确定后,跳转到登录界面: http://www.zhuna.cn/sys_admin/login.php 很自然 ...
- mysql的日志管理
日志操作是数据库维护中最重要的手段之一,日志文件会记录MySQL服务器的各种信息,所以当MySQL服务器遭到意外损坏时,不仅可以通过日志文件来查看出错的原因,而且还可以通过日志文件进行数据恢复. MY ...