/**
题意: 有两种塔,重塔,轻塔。每种塔,能攻击他所在的一行和他所在的一列, 轻塔不 能被攻击,而重塔可以被至多一个塔攻击,也就是说重塔只能被重塔攻击。在一个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. 对开发中常见的内存泄露,GDI泄露进行检测

    对开发中常见的内存泄露,GDI泄露进行检测 一.GDI泄露检测方法: 在软件测试阶段,可以通过procexp.exe 工具,或是通过任务管理器中选择GDI对象来查看软件GDI的对象是使用情况. 注意点 ...

  2. 23种设计模式的C++实现

    之前看Head First设计模式的时候照着书上的代码实现了一个C++版本(书上是Java版本的),代码上传在https://github.com/clpsz/Book-HFDP-Code. 当时因为 ...

  3. 1.2UISwitch 1.3 自定义UIswitch 1.4pickerView

    1.2 UISwitch创建和使用开关 问题你想给你的用户打开一个选项或关闭的能力.解使用UISwitch类. 讨论该UISwitch类提供像在图1-7为自动大写,自动校正,等等所示的开/ ...

  4. 新浪微博 2.4sdk 一闪而过

    解决方法,保持 ios应用中的 build id和 开放平台中填写的一致

  5. HDU 4861 Couple doubi(找规律|费马定理)

    Couple doubi Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit ...

  6. zoj 1083 Frame Stacking

    其实就是一个拓补排序.(动态记录第i个之上的j存不存在,反过来就是第j个之下的i) 首先确立每个框的位置(题目明确说了每一边都不会被完全覆盖)./*可以通过搜索,搜索到该框的所有四个角*/||如果题目 ...

  7. WPF多线程下载文件,有进度条

    //打开对话框选择文件         private void OpenDialogBox_Click(object sender, RoutedEventArgs e)         {     ...

  8. java 成员访问修饰符

    作用域 当前类 当前包(package) 子类 其他包(package) public ok ok ok ok protected ok ok ok no default ok ok no no pr ...

  9. mysql 锁表查询及其处理

    1.show OPEN TABLES where In_use > 0; 2.show processlist; 3.kill thread_id; 其中 thread_id为processli ...

  10. CSS 文章段落样式

    #adiv p { text-align: left; text-indent: 2em; line-height:25px; font-family:微软雅黑; font-size:medium; ...