QOJ.ac

QOJ

시간 제한: 1 s 메모리 제한: 512 MB 총점: 100 난이도: [표시] 해킹 가능 ✓

#174. Якість контрольних цифр

통계

Невелике місто, у якому ви живете, планує запровадити нову систему номерів соціального страхування (SSN). Кожного громадянина буде ідентифіковано п'ятизначним номером SSN. Його перші чотири цифри позначають базовий ідентифікаційний номер (0000–9999), а остання цифра є контрольною цифрою для виявлення помилок.

Для обчислення контрольних цифр місто вирішило використовувати таблицю операції. Таблиця операції — це таблиця десяткових цифр розміром $10 \times 10$, усі діагональні елементи якої дорівнюють $0$. Нижче наведено два приклади таблиць операції.

Таблиця операції 1

$0$ $1$ $2$ $3$ $4$ $5$ $6$ $7$ $8$ $9$
$0$ $0$ $3$ $1$ $7$ $5$ $9$ $8$ $6$ $4$ $2$
$1$ $7$ $0$ $9$ $2$ $1$ $5$ $4$ $8$ $6$ $3$
$2$ $4$ $2$ $0$ $6$ $8$ $7$ $1$ $3$ $5$ $9$
$3$ $1$ $7$ $5$ $0$ $9$ $8$ $3$ $4$ $2$ $6$
$4$ $6$ $1$ $2$ $3$ $0$ $4$ $5$ $9$ $7$ $8$
$5$ $3$ $6$ $7$ $4$ $2$ $0$ $9$ $5$ $8$ $1$
$6$ $5$ $8$ $6$ $9$ $7$ $2$ $0$ $1$ $3$ $4$
$7$ $8$ $9$ $4$ $5$ $3$ $6$ $2$ $0$ $1$ $7$
$8$ $9$ $4$ $3$ $8$ $6$ $1$ $7$ $2$ $0$ $5$
$9$ $2$ $5$ $8$ $1$ $4$ $3$ $6$ $7$ $9$ $0$

Таблиця операції 2

$0$ $1$ $2$ $3$ $4$ $5$ $6$ $7$ $8$ $9$
$0$ $0$ $1$ $2$ $3$ $4$ $5$ $6$ $7$ $8$ $9$
$1$ $9$ $0$ $1$ $2$ $3$ $4$ $5$ $6$ $7$ $8$
$2$ $8$ $9$ $0$ $1$ $2$ $3$ $4$ $5$ $6$ $7$
$3$ $7$ $8$ $9$ $0$ $1$ $2$ $3$ $4$ $5$ $6$
$4$ $6$ $7$ $8$ $9$ $0$ $1$ $2$ $3$ $4$ $5$
$5$ $5$ $6$ $7$ $8$ $9$ $0$ $1$ $2$ $3$ $4$
$6$ $4$ $5$ $6$ $7$ $8$ $9$ $0$ $1$ $2$ $3$
$7$ $3$ $4$ $5$ $6$ $7$ $8$ $9$ $0$ $1$ $2$
$8$ $2$ $3$ $4$ $5$ $6$ $7$ $8$ $9$ $0$ $1$
$9$ $1$ $2$ $3$ $4$ $5$ $6$ $7$ $8$ $9$ $0$

За допомогою таблиці операції контрольна цифра $e$ для чотиризначного базового ідентифікаційного номера $abcd$ обчислюється за такою формулою. Тут $i \otimes j$ позначає елемент таблиці в рядку $i$ та стовпці $j$.

$$e = (((0 \otimes a) \otimes b) \otimes c) \otimes d$$

Наприклад, якщо використати Таблицю операції 1, контрольна цифра $e$ для базового ідентифікаційного номера $abcd = 2016$ обчислюється таким чином.

$$\begin{aligned} e &= (((0 \otimes 2) \otimes 0) \otimes 1) \otimes 6 \\ &= ((1 \otimes 0) \otimes 1) \otimes 6 \\ &= (7 \otimes 1) \otimes 6 \\ &= 9 \otimes 6 \\ &= 6 \end{aligned}$$

Отже, номер SSN дорівнює $20166$.

Зауважте, що контрольна цифра залежить від використовуваної таблиці операції. Із Таблицею операції 2 для того самого базового ідентифікаційного номера $2016$ маємо $e = 3$, а весь номер SSN дорівнюватиме $20163$.

$$\begin{array}{c} \begin{aligned} 2016 & \\ \Downarrow & \; \text{+контрольна цифра за Таблицею операції 2} \\ 20163 & \\ \Downarrow & \; \text{людські помилки} \end{aligned} \\[6pt] \boxed{\begin{array}{c} \overbrace{\mathbf{0}0163 \quad \mathbf{1}0163 \quad \dots \quad \mathbf{9}0163 \quad 2\mathbf{1}163 \quad 2\mathbf{2}163 \quad \dots \quad 2016\mathbf{8} \quad 2016\mathbf{9}}^{\text{Зміна однієї цифри}} \\[10pt] \overbrace{\mathbf{02}163 \quad 2\mathbf{10}63 \quad 20\mathbf{61}3 \quad 201\mathbf{36}}^{\text{Перестановка двох сусідніх цифр}} \end{array}} \end{array}$$

Рисунок B.1. Два види поширених людських помилок

Мета додавання контрольної цифри — виявляти людські помилки під час написання або введення номерів SSN. Наведена нижче функція check здатна виявляти певні людські помилки. Для п'ятизначного числа $abcde$ функція check визначається так.

$$\operatorname{check}(abcde) = ((((0 \otimes a) \otimes b) \otimes c) \otimes d) \otimes e$$

Для правильного номера SSN ця функція повертає $0$. Це пояснюється тим, що кожен діагональний елемент таблиці операції дорівнює $0$, а для правильного SSN виконується $e = (((0 \otimes a) \otimes b) \otimes c) \otimes d$:

$$\operatorname{check}(abcde) = ((((0 \otimes a) \otimes b) \otimes c) \otimes d) \otimes e = e \otimes e = 0.$$

З іншого боку, ненульове значення, яке повертає check, свідчить про те, що задане число не може бути правильним номером SSN. Зауважте, що залежно від використовуваної таблиці операції функція check може повернути $0$ і для неправильного SSN. Які саме види помилок виявляються, залежить від використовуваної таблиці операції; таблиця визначає якість виявлення помилок.

Міська влада хоче виявляти два види поширених людських помилок у послідовностях цифр: зміну однієї цифри та перестановку двох сусідніх цифр, як показано на рисунку B.1.

Таблиця операції називається хорошою, якщо вона здатна виявити всі поширені помилки обох видів для всіх номерів SSN, утворених із чотиризначних базових ідентифікаційних номерів 0000–9999. Зауважте, що мають виявлятися як помилки в контрольній цифрі, так і помилки в чотирьох цифрах базового ідентифікаційного номера. Наприклад, Таблиця операції 1 є хорошою. Таблиця операції 2 не є хорошою, оскільки для числа $20613$, отриманого перестановкою 3-ї та 4-ї цифр правильного номера SSN $20163$, значення $\operatorname{check}(20613)$ дорівнює $0$. Насправді серед $10000$ базових ідентифікаційних номерів Таблиця операції 2 не може виявити одну чи більше поширених помилок аж для $3439$ базових ідентифікаційних номерів.

За заданою таблицею операції визначте, наскільки вона хороша, підрахувавши кількість базових ідентифікаційних номерів, для яких ця таблиця не може виявити одну чи більше поширених помилок.

Вхідні дані

Вхідні дані складаються з одного тестового прикладу в такому форматі.

$$\begin{array}{cccc} x_{00} & x_{01} & \cdots & x_{09} \\ \vdots & & & \\ x_{90} & x_{91} & \cdots & x_{99} \end{array}$$

Вхідні дані описують таблицю операції, де $x_{ij}$ — десяткова цифра в рядку $i$ та стовпці $j$. Кожен рядок вхідних даних відповідає рядку таблиці, елементи в якому відокремлені одним пробілом. Діагональні елементи $x_{ii}$ ($i = 0, \ldots, 9$) завжди дорівнюють $0$.

Вихідні дані

Виведіть кількість базових ідентифікаційних номерів, для яких задана таблиця не може виявити одну чи більше поширених людських помилок.

Приклади

Вхідні дані 1

0 3 1 7 5 9 8 6 4 2
7 0 9 2 1 5 4 8 6 3
4 2 0 6 8 7 1 3 5 9
1 7 5 0 9 8 3 4 2 6
6 1 2 3 0 4 5 9 7 8
3 6 7 4 2 0 9 5 8 1
5 8 6 9 7 2 0 1 3 4
8 9 4 5 3 6 2 0 1 7
9 4 3 8 6 1 7 2 0 5
2 5 8 1 4 3 6 7 9 0

Вихідні дані 1

0

Вхідні дані 2

0 1 2 3 4 5 6 7 8 9
9 0 1 2 3 4 5 6 7 8
8 9 0 1 2 3 4 5 6 7
7 8 9 0 1 2 3 4 5 6
6 7 8 9 0 1 2 3 4 5
5 6 7 8 9 0 1 2 3 4
4 5 6 7 8 9 0 1 2 3
3 4 5 6 7 8 9 0 1 2
2 3 4 5 6 7 8 9 0 1
1 2 3 4 5 6 7 8 9 0

Вихідні дані 2

3439

Вхідні дані 3

0 9 8 7 6 5 4 3 2 1
1 0 9 8 7 6 5 4 3 2
2 1 0 9 8 7 6 5 4 3
3 2 1 0 9 8 7 6 5 4
4 3 2 1 0 9 8 7 6 5
5 4 3 2 1 0 9 8 7 6
6 5 4 3 2 1 0 9 8 7
7 6 5 4 3 2 1 0 9 8
8 7 6 5 4 3 2 1 0 9
9 8 7 6 5 4 3 2 1 0

Вихідні дані 3

9995

Вхідні дані 4

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

Вихідні дані 4

10000

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.