AT_bcu30_c クロスワード

题目描述

在 CyberAgent 的员工之间,填字游戏非常流行。 这次要制作的填字游戏是一个 $2$ 行 $2$ 列的 $4$ 格,每个格子中放入一个字符,使得每一行从左到右读、每一列从上到下读时,都能组成一个合法的单词。由于字符种类较多,本题中我们用整数来代表每个字符。 现在给定字符的种类数 $N$,以及字典中收录的 $M$ 个单词。每个字符用 $1$ 到 $N$ 的整数表示。字典包含 $M$ 行,第 $i$ 行 $(1 \leq i \leq M)$ 给出整数 $a_i$ 和 $b_i$,表示以 $a_i$ 为第一个字符、$b_i$ 为第二个字符的一个合法单词。字典中不会有重复单词。 初始时所有格子为空,你要按照上述规则——每一行和每一列读出的序列都能在字典中找到——统计所有可能的字符填入方式总数。允许同一个单词在行和列中重复使用。

输入格式

输入按以下格式给出: > $N$ $M$ > $a_1$ $b_1$ > $\vdots$ > $a_M$ $b_M$

输出格式

输出所有可能的字符填入方式的总数。

说明/提示

## 限制条件 - $1 \leq N \leq 300$ - $1 \leq M \leq N \times N$ - $1 \leq a_i, b_i \leq N$ $(1 \leq i \leq M)$ - $(a_i, b_i) \neq (a_j, b_j)$ $(1 \leq i < j \leq M)$ ## 样例解释 1 所有可能的字符填入方式如下图所示,共有 $5$ 种。 ![](https://atcoder.jp/img/bcu30/56f98e18495b97d297b1fa608c00d57f.png) 由 ChatGPT 5 翻译