ABC225 C - Calendar Validator C++解答例
AtCoder Beginner Contest 225 C - Calendar ValidatorをC++で解きます。
問題
問題文をAtCoderのページより引用します。
問題文
行7列の行列 10^{100} があり、任意の整数対 A についてその (i, j) (1 \leq i \leq 10^{100}, 1 \leq j \leq 7) 成分は (i, j) です。 (i - 1) \times 7 + j
行 N 列の行列 M が与えられるので、 B が B の一部の矩形領域を(向きを変えずに)切り出したものであるかを判定してください。 A
制約
1 \leq N \leq 10^4 1 \leq M \leq 7 1 \leq B_{i, j} \leq 10^9 - 入力はすべて整数
解答例
各要素の法則チェックだけでは不十分
行列
-
:一つ下のマスに行くと数値が7増えるA_{i, j} = A_{i - 1, j} + 7 -
:一つ右のマスに行くと数値が1増えるA_{i, j} = A_{i, j - 1} + 1
従って、与えられた行列
凡例として、以下のような行列
この行列
A から正しく切り出したものかどうかをチェックする
行列行列
チェックする方法としては、7のmodを取る方法が考えられます。
行列
言い換えると、行列
そのため、もし行列
実装する際は、行列No
と答えれば良いでしょう。
実装例
実装例を以下に示します。C++ではstd::vector
同士の比較演算が可能なので、行列
行列
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
int main() {
int64_t N, M;
std::cin >> N >> M;
std::vector<std::vector<int64_t>> B(N, std::vector<int64_t>(M, -1));
for (int64_t i = 0; i < N; i++) {
for (int64_t j = 0; j < M; j++) {
std::cin >> B.at(i).at(j);
}
}
// 比較評価用の行列C
std::vector<std::vector<int64_t>> C(N, std::vector<int64_t>(M, -1));
C.at(0).at(0) = B.at(0).at(0);
for (int64_t i = 0; i < N; i++) {
for (int64_t j = 0; j < M; j++) {
C.at(i).at(j) = C.at(0).at(0) + 7 * i + j;
}
}
// Aから切りだしたものかどうかを7の余りを取ることでチェックする
bool ok = true;
for (int64_t i = 0; i < N; i++) {
for (int64_t j = 0; j < M - 1; j++) {
if (B.at(i).at(j) % 7 == 0) {
ok = false;
}
}
}
// 両者を満たしているときのみYesと答える
if (ok && B == C) {
std::cout << "Yes" << std::endl;
} else {
std::cout << "No" << std::endl;
}
return 0;
}
実際に提出したコードはこちら。
Discussion