|
- #pragma GCC target ("avx2")
- #pragma GCC optimize ("Ofast")
- #pragma GCC optimize ("unroll-loops")
- #include "bits/stdc++.h"
-
- #define iosb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)
- #define BIT(x) __builtin_popcount(x)
- #define all(x) x.begin() , x.end()
- #define F first
- #define S second
- #define pb push_back
-
- using namespace std ;
-
- typedef unsigned long long UL ;
- typedef long long L ;
- typedef string T ;
- typedef int I ;
-
- const I MaxN = 1e5+1 ;
- const I MOD = 1e9+7 ;
- const I inf = 2e9+7 ;
- const L INF = 2e18+7 ;
-
- char c[3001][3001] ;
- L dp[3001][3001], pd[3001][3001] ;
- bool ok[3001][3001], ok2[3001][3001] ;
-
- int32_t main()
- {
- iosb ;
- int n, m ;
- cin >> n >> m ;
- for(int i = 1 ; i <= n ; ++i)
- for(int j = 1 ; j <= m ; ++j)
- cin >> c[i][j] ;
-
- dp[2][1] = 1, pd[1][2] = 1 ;
- if(c[2][1]!='#')
- ok[2][1] = 1, ok2[2][1] = 1 ;
- if(c[1][2]!='#')
- ok[1][2] = 1, ok2[1][2] = 1 ;
- for(int i = 2 ; i <= n ; ++i)
- for(int j = 1 ; j <= m ; ++j)
- {
- if(i==2&&j==1)
- continue ;
- if(i==2)
- {
- if(c[i][j] == '#')
- ok[i][j] = 0 ;
- else if(!ok[i][j-1])
- ok[i][j] = 0 ;
- else
- dp[i][j] = dp[i][j-1], dp[i][j]%=MOD, ok[i][j] = 1 ;
- continue ;
- }
- if(j==1)
- {
- if(c[i][j] == '#')
- ok[i][j] = 0 ;
- else if(!ok[i-1][j])
- ok[i][j] = 0 ;
- else
- dp[i][j] = dp[i-1][j], dp[i][j]%=MOD, ok[i][j] = 1 ;
- continue ;
- }
- if(c[i][j] == '#')
- ok[i][j] = 0 ;
- else if(!ok[i][j-1] && !ok[i-1][j])
- ok[i][j] = 0 ;
- else
- dp[i][j] = dp[i][j-1] + dp[i-1][j], dp[i][j]%=MOD, ok[i][j] = 1 ;
- }
-
- for(int i = 1 ; i <= n ; ++i)
- for(int j = 2 ; j <= m ; ++j)
- {
- if(i==1&&j==2)
- continue ;
- if(i==1)
- {
- if(c[i][j] == '#')
- ok2[i][j] = 0 ;
- else if(!ok2[i][j-1])
- ok2[i][j] = 0 ;
- else
- pd[i][j] = pd[i][j-1], pd[i][j]%=MOD, ok2[i][j] = 1 ;
- continue ;
- }
- if(j==2)
- {
- if(c[i][j] == '#')
- ok2[i][j] = 0 ;
- else if(!ok2[i-1][j])
- ok2[i][j] = 0 ;
- else
- pd[i][j] = pd[i-1][j], pd[i][j]%=MOD, ok2[i][j] = 1 ;
- continue ;
- }
- if(c[i][j] == '#')
- ok2[i][j] = 0 ;
- else if(!ok2[i][j-1] && !ok2[i-1][j])
- ok2[i][j] = 0 ;
- else
- pd[i][j] = pd[i][j-1] + pd[i-1][j], pd[i][j]%=MOD, ok2[i][j] = 1 ;
- }
-
- if(ok[n][m-1] && ok2[n-1][m])
- {
- L ans = (((dp[n][m-1]*pd[n-1][m])%MOD)-((dp[n-1][m]*pd[n][m-1])%MOD)) ;
- if(ans<0)
- ans = MOD+ans ;
- cout << ans << '\n' ;
- }
- else
- cout << 0 << '\n' ;
- }
|