ABC225C - Calendar Validator

方法1

コンテスト中に考えた方法です.
  1. $B_{00} = (i-1)\times 7 + j$を満たす$(i, j)$が存在し,
  2. $1 \leq i \leq i + N - 1 \leq 10^{100}$,$1 \leq j \leq j + M - 1 \leq 7$を満たし,
  3. $B_{kl} = B_{00} + 7k + l$を満たす
ならYesです.

1. で,$j$の範囲は$1\sim 7$なので,$j$を決めて$i$を求めれば,あとは他の条件を地道に確かめるだけです.

回答例

N, M = map(int, input().split())
B = [list(map(int, input().split())) for _ in range(N)]

for j in range(1, 8):
  X = B[0][0] - j
  # i = X / 7 + 1
  if X < 0 or X % 7 != 0:
    continue
  if j + M - 1 > 7:
    continue
  flag = True
  for k in range(N):
    for l in range(M):
      if B[k][l] != B[0][0] + 7 * k + l:
        flag = False
        break
    if not flag:
      break
  if flag:
    exit(print('Yes'))
print('No')  


方法2

こういう考え方ができると,実装がシンプルになるようです.
【参考】【競プロ実況】ABC225 AからD問題【かつっぱ】 - YouTube (Submission #26896285 - UNICORN Programming Contest 2021(AtCoder Beginner Contest 225))

「7で割り切れる$\Leftrightarrow j=7$」に着目すると,端をまたいでしまっているかが簡単に判定できるということです.