2017百度之星初赛:B-1001. Chess
2017-08-13 21:41
155 查看
Chess
Accepts: 1805
Submissions: 5738
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
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
答案就是C(max(n, m), min(n, m))
不用Lucas也行
#include<stdio.h>
#include<algorithm>
using namespace std;
#define LL long long
LL Pow(LL a, LL b, LL mod);
LL C(LL m, LL n, LL p);
LL Pow(LL a, LL b, LL mod)
{
LL sum;
sum = 1;
while(b)
{
if(b%2==1)
sum = (sum*a)%mod;
a = (a*a)%mod;
b /= 2;
}
return sum;
}
LL C(LL m, LL n, LL p)
{
LL i, ans;
ans = 1;
if(m<n)
return 0;
for(i=1;i<=n;i++)
ans = ans*(((m-n+i)%p)*Pow(i, p-2, p)%p)%p;
return ans;
}
int main(void)
{
LL T, n, m;
scanf("%I64d", &T);
while(T--)
{
scanf("%I64d%I64d", &n, &m);
if(n>m)
swap(n, m);
printf("%I64d\n", C(m, n, 1000000007));
}
return 0;
}
相关文章推荐
- 百度之星2017初赛A轮 1001 小C的倍数问题
- 2017百度之星初赛a
- hdu 6119/2017百度之星初赛B——小小粉丝度度熊(尺取/贪心)
- 2017百度之星初赛b
- 2017百度之星初赛A 今夕何夕
- 百度之星2017初赛A-1005-今夕何夕
- 2017百度之星初赛(B)1001Chess------hdu6114
- 2017百度之星初赛:B-1006. 小小粉丝度度熊(贪心+尺取)
- 【2017"百度之星"程序设计大赛 - 初赛(B)】度度熊的交易计划
- 2017百度之星初赛B Chess
- 2017百度之星初赛(A) 1005 今夕何夕(阅读题)
- 2017百度之星初赛(A)1001 小C的倍数问题(求因子数)
- 2017百度之星初赛:A-1002. 数据分割(并查集+set)
- 2017百度之星初赛A-1006(HDU-6113)
- 【2017"百度之星"程序设计大赛 - 初赛(B)】小小粉丝度度熊
- 2017 百度之星 初赛B轮 HDU6114 HDU6118 HDU6119
- 2017百度之星初赛(B)-1001Chess
- 2017百度之星初赛A-1006(HDU-6113)
- 【2017"百度之星"程序设计大赛 - 初赛(B)】Chess
- HDU 6108 小C的倍数问题 (数论 2017百度之星初赛A第1题)