方法1
コンテスト中に考えた方法です.- $B_{00} = (i-1)\times 7 + j$を満たす$(i, j)$が存在し,
- $1 \leq i \leq i + N - 1 \leq 10^{100}$,$1 \leq j \leq j + M - 1 \leq 7$を満たし,
- $B_{kl} = B_{00} + 7k + l$を満たす
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$」に着目すると,端をまたいでしまっているかが簡単に判定できるということです.