Guest User

Discovering Paths

a guest
Jun 2nd, 2016
319
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.22 KB | None | 0 0
  1. /*
  2. Case:
  3. 2
  4. 5 5 4
  5. 1 1 2 2
  6. 0 1 2 3
  7. 0 2 0 3
  8. 0 0 0 1
  9. 4 4 3
  10. 3 3 3 3
  11. 0 0 0 0
  12. 1 1 2 2
  13.  
  14. Output:
  15. Case 1
  16. Query 1: 10
  17. Query 2: 5
  18. Query 3: 55
  19. Query 4: 0
  20. Case 2
  21. Query 1: 0
  22. Query 2: 0
  23. Query 3: 2
  24. */
  25.  
  26. #include <algorithm>
  27. #include <bitset>
  28. #include <cmath>
  29. #include <cstdio>
  30. #include <cstring>
  31. #include <deque>
  32. #include <iomanip>
  33. #include <iostream>
  34. #include <queue>
  35. #include <map>
  36. #include <numeric>
  37. #include <set>
  38. #include <sstream>
  39. #include <stack>
  40. #include <utility>
  41. #include <vector>
  42.  
  43. #define INF 1000000000
  44. #define FOR(i, a, b) for(int i=int(a); i<int(b); i++)
  45. #define FORC(cont, it) for(decltype((cont).begin()) it = (cont).begin(); it != (cont).end(); it++)
  46. #define pb push_back
  47.  
  48. using namespace std;
  49.  
  50. typedef long long ll;
  51. typedef pair<int, int> ii;
  52. typedef vector<int> vi;
  53. typedef vector<ii> vii;
  54. typedef vector<vi> vvi;
  55.  
  56. #define maxSize 1001
  57. #define MOD 912
  58.  
  59. ii mat[maxSize][maxSize], ans[maxSize][maxSize];
  60.  
  61. int main() {
  62. int T, R, C, Q, a, b, c,d, caso=1;
  63. scanf("%d", &T);
  64. while (T--) {
  65. scanf("%d %d %d", &R, &C, &Q);
  66. printf("Case %d\n", caso++);
  67. memset(mat, 0, sizeof(mat));
  68. mat[R-1][C-1].second = mat[0][0].first = 1;
  69. //First is how many ways to reach this square from start position, second how many ways to reach end from here
  70. FOR(i, 0, R) {
  71. FOR(j, 0, C) {
  72. if (i) mat[i][j].first += mat[i - 1][j].first, mat[R - i - 1][C - j - 1].second += mat[R - i][C - j - 1].second;
  73. if (j) mat[i][j].first += mat[i][j - 1].first, mat[R - i - 1][C - j - 1].second += mat[R - i - 1][C - j].second;
  74. mat[i][j].first %= MOD, mat[R - i - 1][C - j - 1].second %= MOD;
  75. }
  76. }
  77. //First is rows, second columns
  78. FOR(i, 0, R) {
  79. FOR(j, 0, C) {
  80. ans[i + 1][j + 1].first = (mat[i][j].first*mat[i + 1][j].second + ans[i + 1][j].first) % MOD;
  81. ans[i + 1][j + 1].second = (mat[i][j].first*mat[i][j + 1].second + ans[i][j + 1].second) % MOD;
  82. }
  83. }
  84. FOR(i,1,Q+1) {
  85. scanf("%d %d %d %d", &a, &b, &c, &d);
  86. int aa = (ans[a][d + 1].first - ans[a][b].first + ans[c + 1][b].second - ans[a][b].second + 2 * MOD) % MOD;
  87. if (!a&&!b) aa = mat[0][0].second;
  88. printf(" Query %d: %d\n", i, (mat[0][0].second - aa + MOD) % MOD);
  89. }
  90. }
  91. return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment