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的线路,路上的每个单元格可以部署三种塔来给走在这条路上的敌人造成伤害,第一 ...
随机推荐
- IOS常用的第三方开发库
开发几个常用的开源类库及下载地址: 1.json json编码解码2.GTMBase64 base64编码解码3.TouchXML xml解析4.SFHFKeychainUtils 安全保存用户密码到 ...
- POJ 1755 Triathlon (半平面交)
Triathlon Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4733 Accepted: 1166 Descrip ...
- Altium Protel PCB Layer
The layers themselves are grouped by their functional types: Signal Layers – Top Layer, Bottom Layer ...
- ArcGIS教程:编辑特征
摘要 通过合并.又一次编号和删除类特征来编辑和更新特征文件. 使用方法 · 编辑特征工具同意您通过下面全部操作或某一操作来改动现有特征文件: 合并一组特征类 又一次编号特征类 ID 删除不须要的特征 ...
- Delegates and Events
People often find it difficult to see the difference between events and delegates. C# doesn't help m ...
- 解决引用openssl静态库libcrypto.a和libssl.a出现undefined reference to错误的问题
最近在做使用openssl链接http和https的项目,编译时出现以下问题. /usr/local/openssl/lib/libcrypto.a(async.o): In function `as ...
- HTML5移动web横屏字体变大
html{ -webkit-text-size-adjust:none; -ms-text-size-adjust:none; -moz--text-size-adjust:none; text-si ...
- js和jquery判断事件流
$('body').on('click',function(e){ var $target = $(e.target); if($target.parents('.fixNav>div').le ...
- Android -- 再来一发Json
之前写过一篇Json的博客,当时用的是Gson包来解析的,这次来此自带的org.json来解析.传送门:<Gson解析复杂Json数据> JSON的结构 (1) Name/Value Pa ...
- import MySQLdb UserWarning
Finished processing dependencies for MySQL-python==1.2.5 ╭─haoke@haokedeMBP ~/ProgramFiles/MySQL-pyt ...