DSA
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

118 lines
3.2 KiB

  1. #pragma GCC target ("avx2")
  2. #pragma GCC optimize ("Ofast")
  3. #pragma GCC optimize ("unroll-loops")
  4. #include "bits/stdc++.h"
  5. #define iosb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)
  6. #define BIT(x) __builtin_popcount(x)
  7. #define all(x) x.begin() , x.end()
  8. #define F first
  9. #define S second
  10. #define pb push_back
  11. using namespace std ;
  12. typedef unsigned long long UL ;
  13. typedef long long L ;
  14. typedef string T ;
  15. typedef int I ;
  16. const I MaxN = 1e5+1 ;
  17. const I MOD = 1e9+7 ;
  18. const I inf = 2e9+7 ;
  19. const L INF = 2e18+7 ;
  20. char c[3001][3001] ;
  21. L dp[3001][3001], pd[3001][3001] ;
  22. bool ok[3001][3001], ok2[3001][3001] ;
  23. int32_t main()
  24. {
  25. iosb ;
  26. int n, m ;
  27. cin >> n >> m ;
  28. for(int i = 1 ; i <= n ; ++i)
  29. for(int j = 1 ; j <= m ; ++j)
  30. cin >> c[i][j] ;
  31. dp[2][1] = 1, pd[1][2] = 1 ;
  32. if(c[2][1]!='#')
  33. ok[2][1] = 1, ok2[2][1] = 1 ;
  34. if(c[1][2]!='#')
  35. ok[1][2] = 1, ok2[1][2] = 1 ;
  36. for(int i = 2 ; i <= n ; ++i)
  37. for(int j = 1 ; j <= m ; ++j)
  38. {
  39. if(i==2&&j==1)
  40. continue ;
  41. if(i==2)
  42. {
  43. if(c[i][j] == '#')
  44. ok[i][j] = 0 ;
  45. else if(!ok[i][j-1])
  46. ok[i][j] = 0 ;
  47. else
  48. dp[i][j] = dp[i][j-1], dp[i][j]%=MOD, ok[i][j] = 1 ;
  49. continue ;
  50. }
  51. if(j==1)
  52. {
  53. if(c[i][j] == '#')
  54. ok[i][j] = 0 ;
  55. else if(!ok[i-1][j])
  56. ok[i][j] = 0 ;
  57. else
  58. dp[i][j] = dp[i-1][j], dp[i][j]%=MOD, ok[i][j] = 1 ;
  59. continue ;
  60. }
  61. if(c[i][j] == '#')
  62. ok[i][j] = 0 ;
  63. else if(!ok[i][j-1] && !ok[i-1][j])
  64. ok[i][j] = 0 ;
  65. else
  66. dp[i][j] = dp[i][j-1] + dp[i-1][j], dp[i][j]%=MOD, ok[i][j] = 1 ;
  67. }
  68. for(int i = 1 ; i <= n ; ++i)
  69. for(int j = 2 ; j <= m ; ++j)
  70. {
  71. if(i==1&&j==2)
  72. continue ;
  73. if(i==1)
  74. {
  75. if(c[i][j] == '#')
  76. ok2[i][j] = 0 ;
  77. else if(!ok2[i][j-1])
  78. ok2[i][j] = 0 ;
  79. else
  80. pd[i][j] = pd[i][j-1], pd[i][j]%=MOD, ok2[i][j] = 1 ;
  81. continue ;
  82. }
  83. if(j==2)
  84. {
  85. if(c[i][j] == '#')
  86. ok2[i][j] = 0 ;
  87. else if(!ok2[i-1][j])
  88. ok2[i][j] = 0 ;
  89. else
  90. pd[i][j] = pd[i-1][j], pd[i][j]%=MOD, ok2[i][j] = 1 ;
  91. continue ;
  92. }
  93. if(c[i][j] == '#')
  94. ok2[i][j] = 0 ;
  95. else if(!ok2[i][j-1] && !ok2[i-1][j])
  96. ok2[i][j] = 0 ;
  97. else
  98. pd[i][j] = pd[i][j-1] + pd[i-1][j], pd[i][j]%=MOD, ok2[i][j] = 1 ;
  99. }
  100. if(ok[n][m-1] && ok2[n-1][m])
  101. {
  102. L ans = (((dp[n][m-1]*pd[n-1][m])%MOD)-((dp[n-1][m]*pd[n][m-1])%MOD)) ;
  103. if(ans<0)
  104. ans = MOD+ans ;
  105. cout << ans << '\n' ;
  106. }
  107. else
  108. cout << 0 << '\n' ;
  109. }