当前位置:   article > 正文

【zzuliOJ】1894 - 985的方格难题(组合数学)_在一个神奇的王国里,有一块n行m列的格子地板。每个格子都是一个正方形,里面藏着一

在一个神奇的王国里,有一块n行m列的格子地板。每个格子都是一个正方形,里面藏着一

点击打开题目

1894: 985的方格难题

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 332   Solved: 63

Submit Status Web Board

Description

985走入了一个n * n的方格地图,他已经知道其中有一个格子是坏的。现在他要从(1, 1)走到(n, n),每次只可以向下或者向右走一步,问他能否到达(n,n)。若不能到达输出-1,反之输出到达(n,n)的方案数。

Input

第一行输入一个整数t,代表有t组测试数据。
每组数据第一行输入三个整数n,x,y,分别代表方格地图的大小以及坏掉格子的位置。
注:1 <= t <= 20,1 <= n <= 30,1 <= x,y <= n。

Output

若可以到达(n,n)则输出方案数对1e9 + 7取余的结果,反之输出-1。

Sample Input

2
2 1 2
2 2 2

Sample Output

1
-1

HINT

Source

hpu




搞懂组合数学在这里怎么用,再学会打表就行了,记得用longlong。



代码如下:(比赛的时候是用java拍的抢首A的,拍完发现比赛的时候不支持java提交)

java代码:

  1. import java.math.BigDecimal;
  2. import java.util.Scanner;
  3. public class Main
  4. {
  5. public static void main(String[] args)
  6. {
  7. Scanner sc = new Scanner(System.in);
  8. BigDecimal c[][] = new BigDecimal [66][66];
  9. for (int i = 1 ; i <= 60 ; i++)
  10. {
  11. c[i][0] = new BigDecimal(1);
  12. c[i][i] = new BigDecimal(1);
  13. }
  14. for (int i = 1 ; i <= 60 ; i++)
  15. {
  16. for (int j = 1 ; j < i ; j++)
  17. {
  18. c[i][j] = c[i-1][j].add(c[i-1][j-1]);
  19. }
  20. }
  21. int u = sc.nextInt();
  22. while (u != 0)
  23. {
  24. u--;
  25. int n = sc.nextInt();
  26. int x = sc.nextInt();
  27. int y = sc.nextInt();
  28. if ((x == n && y == n) || (x == 1 && y == 1))
  29. {
  30. System.out.println(-1);
  31. continue;
  32. }
  33. BigDecimal ans = new BigDecimal(0);
  34. int t = n-1;
  35. BigDecimal MOD = new BigDecimal(1000000007);
  36. BigDecimal neg = new BigDecimal(-1);
  37. ans = ans.add(c[t*2][t]);
  38. ans = ans.add(c[x-1+y-1][x-1].multiply(c[n-x+n-y][n-x]).multiply(neg));
  39. ans = ans.remainder(MOD);
  40. System.out.println(ans);
  41. }
  42. }
  43. }


C++代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. #define CLR(a,b) memset(a,b,sizeof(a))
  6. #define INF 0x3f3f3f3f
  7. long long MOD = 1000000007;
  8. long long c[66][66];
  9. void C()
  10. {
  11. for (int i = 0 ; i <= 60 ; i++)
  12. c[i][0] = c[i][i] = 1;
  13. for (int i = 2 ; i <= 60 ; i++)
  14. {
  15. for (int j = 1 ; j < i ; j++)
  16. c[i][j] = (c[i-1][j] + c[i-1][j-1]) % MOD;
  17. }
  18. }
  19. int main()
  20. {
  21. int u;
  22. int n;
  23. int x,y;
  24. C();
  25. scanf ("%d",&u);
  26. while (u--)
  27. {
  28. scanf ("%d %d %d",&n,&x,&y);
  29. if (x == n && y == n)
  30. {
  31. printf ("-1\n");
  32. continue;
  33. }
  34. else if (x == 1 && y == 1)
  35. {
  36. printf ("-1\n");
  37. continue;
  38. }
  39. long long ans;
  40. int t = n-1;
  41. ans = c[t*2][t];
  42. ans -= c[x-1+y-1][x-1] * c[n-x+n-y][n-x];
  43. ans = (ans % MOD + MOD) % MOD;
  44. printf ("%lld\n",ans);
  45. }
  46. return 0;
  47. }


声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号