hdu 6114 百度之星复赛B T1

Chess

Problem Description

車是中国象棋中的一种棋子,它能攻击同一行或同一列中没有其他棋子阻隔的棋子。

一天,小度在棋盘上摆起了许多車……他想知道,在一共N×M个点的矩形棋盘中摆最多个数的車使其互不攻击的方案数。

他经过思考,得出了答案。

但他仍不满足,想增加一个条件:对于任何一个車A,

如果有其他一个車B在它的上方(車B行号小于車A),那么車A必须在車B的右边(車A列号大于車B)。

现在要问问你,满足要求的方案数是多少。

Input

第一行一个正整数T,表示数据组数。

对于每组数据:一行,两个正整数N和M(N<=1000,M<=1000)。

Output

对于每组数据输出一行,代表方案数模1000000007(1e9+7)。

Sample Input

1
1 1

Sample Output

1

——————————————————————————————————————————

这道题很明显必然有行或者列是满的 行列交换答案不变 所以我们可以强制列大于行

那么因为各个位置的相对关系是固定的 所以我们在n列里面选m行之后答案是唯一的

所以问题就转换成了n列选m列 即C(n,m)

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int mod=1000000007;
int T,n,m,ans;
LL c[1005][1005];
LL C(int x,int y)
{
    if(y==x||y==0)return 1;
    if(y==1)return x;
    if(c[x][y])return c[x][y]%mod;
    c[x][y]=(C(x-1,y-1)+C(x-1,y))%mod;
    return c[x][y];
}
int main()
{
    scanf("%d",&T);
    while(T--){
        scanf("%d %d",&n,&m);
        printf("%I64d\n",C(max(n,m),min(n,m)));
    }
    return 0;
}

时间: 2024-08-05 01:02:19

hdu 6114 百度之星复赛B T1的相关文章

2016百度之星复赛 1003 拍照 优先队列

2016"百度之星" - 复赛(Astar Round3) Ended 2016-05-29 14:00:00 - 2016-05-29 17:00:00 Current Time: 00:46:02 Solved Pro.ID Title Ratio(Accepted / Submitted) Language   1001 D++游戏 13.79% (16/116) 中文   1002 K个联通块 17% (136/800) 中文 1003 拍照 22.49% (434/1930)

hdu 4832 百度之星初赛二B

把横的和竖的分开考虑 //#pragma comment(linker, "/STACK:102400000,102400000") #include<iostream> #include<vector> #include<algorithm> #include<cstdio> #include<queue> #include<stack> #include<string> #include<ma

2017百度之星复赛1003Pok&#233;mon GO------hdu6146

题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=6146 分析:这道题有点麻烦啊!貌似是原题,讨论情况好恶心啊. 1.首先呢,我们考虑从左上角出发,先从左往右抓到底,再从右往左抓,因为题目要的是步数最少的,所以不能随便      走.每一步选择有2种可能,所以总的方案数是 b[i] = 2^i (i为列数) 2.我们可以第一列抓完,再抓第二列,也从左上角开始,到第二列有两种可能,到上面的格子和到下面的格子,所以 方案数是  2 * a[i-1] (

2016&quot;百度之星&quot; - 复赛(Astar Round3) 1003 拍照

拍照 思路:先静态,离线树状数组,分别统计每个点向左向右能看到的船的数量.再枚举整个区间求最大值. 应为人和船都是动态的,假设船往左走,处理每个点看到向左最大船的数量,满足动态条件.就是向左的船一开始在最右边,向右的船一开始在最左边,则两船肯定相向运动到某个地方最佳. 1 //#pragma comment(linker, "/STACK:167772160")//手动扩栈~~~~hdu 用c++交 2 #include <cstdio> 3 #include <cs

2017百度之星复赛1001Arithmetic of Bomb------hdu6144

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6144 分析:这道题挺水的,就是讲(a)#(b)表示有b个相连的a,当然也有可能有穿插不是这样表示直接给数字的,比如题目的(12)#(2)4(2)#(3)表示12124222,照着模拟就行了,注意下要到处取模,要不可能出现溢出啥的 代码如下: #include<bits/stdc++.h> using namespace std; typedef long long LL; const LL mod

百度之星复赛T6&amp;&amp;hd6149 ——Valley Numer II

Problem Description 众所周知,度度熊非常喜欢图. 它最近发现了图中也是可以出现 valley -- 山谷的,像下面这张图. 为了形成山谷,首先要将一个图的顶点标记为高点或者低点.标记完成后如果一个顶点三元组<X, Y, Z>中,X和Y之间有边,Y与Z之间也有边,同时X和Z是高点,Y是低点,那么它们就构成一个valley. 度度熊想知道一个无向图中最多可以构成多少个valley,一个顶点最多只能出现在一个valley中. Input 第一行为T,表示输入数据组数. 每组数据的

hdu5713 K个联通块[2016百度之星复赛B题]

dp 代码 1 #include<cstdio> 2 const int N = 30000; 3 const int P = 1000000009; 4 int n,m,k,cnt[N]; 5 long long f[N],g[N],o[N],dp[N][15]; 6 int e[15][15],i,j,l,a,b; 7 int check(int x,int y) 8 { 9 int i; 10 for (i=0;i<n;i++) 11 if ((1<<i)==x) br

最强密码 (百度之星复赛 T5)

题目大意: 给出一个字符串A,要求最短的字符串B,B不是A的子序列. 求最短长度 和 最短的字符串个数    |A|<=105. 题解: 1.比赛的时候没有想出来,时隔一个多月又看到了这道题,虽然已经退役,还是下决心把它弄懂. 2.网络上基本都是直接贴代码的.我还是简要的写一写解法: 可以想象我们在字符串A上移动.一开始在一个起始节点(0号节点)上,如果我们选了字符p,现在在k号节点上,那么我们可以直接跳到p下一次出现的位置r(如果没有,跳到n+1号点). 因为k,r直接没有字符p,就无需考虑它

hdu 6110 …&amp;&amp;百度之星 T6

小小粉丝度度熊 Problem Description 度度熊喜欢着喵哈哈村的大明星--星星小姐. 为什么度度熊会喜欢星星小姐呢? 首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听. 但这都不是最重要的,最重要的是,星星小姐拍的一手好代码! 于是度度熊关注了星星小姐的贴吧. 一开始度度熊决定每天都在星星小姐的贴吧里面签到. 但是度度熊是一个非常健忘的孩子,总有那么几天,度度熊忘记签到,于是就断掉了他的连续签到. 不过度度熊并不是非常悲伤,因为他有m张补签卡,每一张补签卡可以使得某一忘签到的