fork download
  1. #include <cstring>
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. #define ll long long
  6.  
  7. ll memo[2000][4][4];
  8.  
  9. ll dp(int col, int drow, int grow) {
  10. // row out of bound
  11. if (drow < 0 || 4 <= drow || grow < 0 || 4 <= grow)
  12. return 0;
  13. // d crossed with g
  14. if (grow <= drow)
  15. return 0;
  16. // first column
  17. if (col == 1) {
  18. if (drow == 0 && grow == 3)
  19. return 1;
  20. else
  21. return 0;
  22. }
  23. if (memo[col][drow][grow] != -1)
  24. return memo[col][drow][grow];
  25.  
  26. memo[col][drow][grow] = 0;
  27. memo[col][drow][grow] += dp(col-1, drow-1, grow-1);
  28. memo[col][drow][grow] += dp(col-1, drow-1, grow+1);
  29. memo[col][drow][grow] += dp(col-1, drow+1, grow-1);
  30. memo[col][drow][grow] += dp(col-1, drow+1, grow+1);
  31. memo[col][drow][grow] = memo[col][drow][grow] % 7;
  32.  
  33. return memo[col][drow][grow];
  34. }
  35.  
  36. int main() {
  37. int N;
  38. cin >> N;
  39. memset(memo, -1, sizeof(memo));
  40. ll ans = 0;
  41. for (int i = 0; i < 4; i++)
  42. for (int j = i+1; j < 4; j++)
  43. ans += dp(N, i, j);
  44. cout << ans % 7 << endl;
  45. }
Success #stdin #stdout 0.01s 5532KB
stdin
1357
stdout
1