/**
题意: 有两种塔,重塔,轻塔。每种塔,能攻击他所在的一行和他所在的一列, 轻塔不 能被攻击,而重塔可以被至多一个塔攻击,也就是说重塔只能被重塔攻击。在一个n*m 的矩阵中,最少放一个塔,可放多个
问,给定p个重塔,q个轻塔,问有多少种放法。。 思路: 1、 一行中有两个重塔,
2、 一列中有两个重塔
3、 在该行及在该行塔所在的列只有一个塔,重塔或者轻塔。
对以上三种情况
挨个处理:
1、 设有i行有两个重塔,j列有两个重塔,则一共占 i+2*j 行, j+2*i列,共用2*(i+j)个重塔,,因为一行或一列两个塔
2、 对剩余的塔,进行枚举,0<-->剩余的塔,。。,枚举这些塔中重塔的个数进行枚举 对于1: 在行中有两个重塔 c(n,i)*c(m,2*i)*((2*i)!/2^i) 意思 是在n行中选i行,在m列中选2*i列, 对于选出来的2*i 列,分成i组,需要进行全排列,但是组内不需要进行全排列。。所以为(2*i)!/2^i
在列中有两个重塔,c(m-2*i,j)*c(n-i,2*j)*((2*j)!/2^j) 原理同上 对于2:设有k个塔, 在剩余的n-(i+2*j) 行 m-(2*i+j) 列中 选 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;
注意: 在计算的过程中注意%mod
**/ #include <iostream>
#include <algorithm>
using namespace std;
const long long mod = ;
const int maxn = ;
const long long R = ;
long long c[maxn][maxn] ;
long long cs[maxn][maxn];
long long sq[maxn];
long long fac[maxn*];
void init(){
c[][] =;
for(int i=;i<maxn;i++){
c[i][] =c[i][i]=;
for(int j=;j<i;j++){
c[i][j] = (c[i-][j-]+c[i-][j])%mod;
}
}
fac[] =;
for(int i=;i<maxn*;i++)
fac[i] = (fac[i-]*i)%mod; for(int i=;i<maxn;i++){
cs[i][] = ;
for(int j=;j<=i;j++){
cs[i][j] = (cs[i][j-]+c[i][j])%mod;
}
} sq[] =;
sq[] =;
long long rr = R;
for(int i=;i<maxn;i++){
rr = (rr*R)%mod;
sq[i] = (fac[*i]*rr)%mod;
}
} long long cal(long long n,long long m,long long p){
return ((c[n][p]*c[m][*p])%mod*sq[p])%mod;
} long long solve(int z,int x,int y){
if(x>){
return ((cs[z][y]-cs[z][x-])%mod+mod)%mod;
}
return cs[z][y]%mod;
} int main()
{
init();
int n,m,p,q;
int t;
cin>>t;
while(t--){
cin>>n>>m>>p>>q;
long long res =;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if((n>=(i+*j))&&(m>=(*i+j))&&((p-*(i+j))>=)){
int tn = n-(i+*j);
int tm = m-(*i+j);
int tp = p-*(i+j);
int tq = q;
long long ans = (cal(n,m,i)*cal(m-*i,n-i,j))%mod;
for(int k=;k<=tp+tq;k++){
if(k>min(tn,tm))
continue;
int maxp = min(k,tp);
int minp = max(,k-tq);
long long tmp = ((solve(k,minp,maxp)*c[tn][k])%mod*c[tm][k])%mod;
tmp = (tmp*fac[k])%mod;
res = (res+tmp*ans)%mod;
}
}
}
}
res = ((res-)%mod+mod)%mod;
cout<<res<<endl;
}
return ;
}

hdu 4779 Tower Defense 2013杭州现场赛的更多相关文章

  1. 2013杭州现场赛B题-Rabbit Kingdom

    杭州现场赛的题.BFS+DFS #include <iostream> #include<cstdio> #include<cstring> #define inf ...

  2. HDU 4747 Mex (2013杭州网络赛1010题,线段树)

    Mex Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  3. HDU 4816 Bathysphere (2013长春现场赛D题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4816 2013长春区域赛的D题. 很简单的几何题,就是给了一条折线. 然后一个矩形窗去截取一部分,求最 ...

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

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

  5. HDU 4821 String(2013长春现场赛I题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4821 字符串题. 现场使用字符串HASH乱搞的. 枚举开头! #include <stdio.h ...

  6. HDU 4746 HDOJ Mophues 2013杭州网赛I题

    比赛的时候就预感到这题能出,但是会耗时比较多.结果最后是出了,但是有更简单的题没出. 是不是错误的决策呢?谁知道呢 题目意思: 定义f(x) = x分解质因数出来的因子个数 如 x = p0 * p0 ...

  7. HDU 4745 Two Rabbits (2013杭州网络赛1008,最长回文子串)

    Two Rabbits Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  8. HDU 4741 Save Labman No.004 (2013杭州网络赛1004题,求三维空间异面直线的距离及最近点)

    Save Labman No.004 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  9. HDU 4739 Zhuge Liang's Mines (2013杭州网络赛1002题)

    Zhuge Liang's Mines Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

随机推荐

  1. 普通IT和文艺IT工程师的区别

    在一个UITableView的editing设置的方法实现过程中,我想到两种写法,顺便想了一下两种方法的区别.觉得这时一个普通IT工程师和NB工程师的区别一个有趣的印记. 您通常时怎么去实现的呢? - ...

  2. flume 自己定义 hbase sink 类

    參考(向原作者致敬) http://ydt619.blog.51cto.com/316163/1230586 https://blogs.apache.org/flume/entry/streamin ...

  3. Apache OFbiz entity engine源代码解读

    简单介绍 近期一直在看Apache OFbiz entity engine的源代码.为了能够更透彻得理解,也由于之前没有看人别人写过分析它的文章,所以决定自己来写一篇. 首先,我提出一个问题,假设你有 ...

  4. 虎扯:小众玩物 webkit家的滚动条

    前面的话:对只有一种浏览器支持的属性,就不要出来秀咱前端同学,就像是早些年手机们的充电口一样,集各家所长,咱今天说的是webkit的滚动条样式,视乎只有webkit支持此项定义,有见识的前辈来辩.这玩 ...

  5. Sharepoint 2013 --系统安装配置

    参考博客: http://www.cnblogs.com/jianyus/archive/2013/02/01/2889653.html 安装操作系统->改机器名->装AD->装DN ...

  6. 【原创】移除RX filters在C118上面

    » 作者:LSX » 原创文章版权归作者所有,未经作者同意请保留以下声明. » 本文链接:http://blog.lishixin.net/?p=1318 » 转载请注明来源:LSX·Blog » & ...

  7. 青蛙跳台阶问题——剑指offer

    题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶,求该青蛙跳上一个n级台阶总共有多少中跳法. http://www.nowcoder.com/books/coding-interviews?pa ...

  8. php 通过referer防盗链(以图片为例)

    1.在网页里访问站外图片时,服务器如何知道是在站外引用的呢? (1)对比本服务器请求与跨服务器请求 图一——本服务器请求 图二——显示盗链的referer信息 通过对比也就知道referer显示的是引 ...

  9. linux 命令大全

    工作了一段时间,开始整理资料,好记性不如烂笔头啊. linux命令大全下载路径: 1.http://www.pc6.com/SoftView/SoftView_28912.html 2.http:// ...

  10. C++ 面向对象学习2 构造方法

    Date.h #ifndef DATE_H #define DATE_H class Date{ public: Date(,,);//自定义了构造方法 会覆盖掉默认的无参构造方法 void setD ...