Advertisement
YEZAELP

CUBE-161: Frenemy

Oct 19th, 2021
1,009
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. using lli = long long;
  5. const lli mod = 1e9 + 7;
  6. lli dp[1001][1001][4];
  7.  
  8. int main(){
  9.  
  10.     int n;
  11.     scanf("%d", &n);
  12.  
  13.     char ar[n+1][n+1];
  14.     for(int i=1;i<=n;i++){
  15.         for(int j=1;j<=n;j++){
  16.             scanf(" %c", &ar[i][j]);
  17.         }
  18.     }
  19.  
  20.     /// TopL_BotR
  21.         /// (1, 1) -> (n, n)
  22.         /// TopL_BotR[i][j][1] = TopL_BotR[i][j-1][1] + TopL_BotR[i-1][j][1]
  23.         dp[1][1][0] = 1;
  24.         for(int i=1;i<=n;i++){
  25.             for(int j=1;j<=n;j++){
  26.                 if(ar[i][j] == '0' or (i == 1 and j == 1)) continue;
  27.                 dp[i][j][0] = (dp[i][j-1][0] + dp[i-1][j][0]) % mod;
  28.             }
  29.         }
  30.         /// (n, n) -> (1, 1)
  31.         /// TopL_BotR[i][j][2] = TopL_BotR[i+1][j][2] + TopL_BotR[i][j+1][2]
  32.         dp[n][n][1] = 1;
  33.         for(int i=n;i>=1;i--){
  34.             for(int j=n;j>=1;j--){
  35.                 if(ar[i][j] == '0' or (i == n and j == n)) continue;
  36.                 dp[i][j][1] = (dp[i+1][j][1] + dp[i][j+1][1]) % mod;
  37.             }
  38.         }
  39.     /// BotL_TopR
  40.         /// (1, n) -> (n, 1)
  41.         /// BotL_TopR[i][j][1] = BotL_TopR[i-1][j][1] + BotL_TopR[i][j+1][1]
  42.         dp[1][n][2] = 1;
  43.         for(int i=1;i<=n;i++){
  44.             for(int j=n;j>=1;j--){
  45.                 if(ar[i][j] == '0' or (i == 1 and j == n)) continue;
  46.                 dp[i][j][2] = (dp[i-1][j][2] + dp[i][j+1][2]) % mod;
  47.             }
  48.         }
  49.         /// (n, 1) -> (1, n)
  50.         /// BotL_TopR[i][j][2] = BotL_TopR[i+1][j][2] + BotL_TopR[i][j-1][2]
  51.         dp[n][1][3] = 1;
  52.         for(int i=n;i>=1;i--){
  53.             for(int j=1;j<=n;j++){
  54.                 if(ar[i][j] == '0' or (i == n and j == 1)) continue;
  55.                 dp[i][j][3] = (dp[i+1][j][3] + dp[i][j-1][3]) % mod;
  56.             }
  57.         }
  58.     /// Query
  59.     lli ans = 0;
  60.     for(int i=1;i<=n;i++){
  61.         for(int j=1;j<=n;j++){
  62.             if(ar[i][j] == '0') continue;
  63.             ans = ( ans + (( (dp[i][j-1][3] * dp[i][j+1][2] ) % mod) * ( (dp[i-1][j][0] * dp[i+1][j][1] ) % mod) ) % mod ) % mod;
  64.             ans = ( ans + (( (dp[i][j-1][0] * dp[i][j+1][1] ) % mod) * ( (dp[i-1][j][2] * dp[i+1][j][3] ) % mod) ) % mod ) % mod;
  65.         }
  66.     }
  67.  
  68.     printf("%lld", ans);
  69.  
  70.     return 0;
  71. }
  72.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement