QOJ.ac

QOJ

時間限制: 1 s 記憶體限制: 512 MB 總分: 100 难度: [顯示] 可 Hack ✓

#174. Kvaliteten på kontrollsifre

统计

Den lille byen der du bor, planlegger å innføre et nytt system for trygdenumre (SSN). Hver innbygger vil bli identifisert med et femsifret SSN. De fire første sifrene angir basis-ID-nummeret (0000–9999), og det siste sifferet er et kontrollsiffer for å oppdage feil.

For å beregne kontrollsifre har byen bestemt seg for å bruke en operasjonstabell. En operasjonstabell er en $10 \times 10$-tabell med desimalsifre der alle diagonalelementene er $0$. Nedenfor vises to eksempler på operasjonstabeller.

Operasjonstabell 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$

Operasjonstabell 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$

Ved hjelp av en operasjonstabell beregnes kontrollsifferet $e$ for et firesifret basis-ID-nummer $abcd$ med følgende formel. Her betegner $i \otimes j$ tabellelementet i rad $i$ og kolonne $j$.

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

For eksempel beregnes kontrollsifferet $e$ for basis-ID-nummeret $abcd = 2016$ ved bruk av Operasjonstabell 1 på følgende måte.

$$\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}$$

Dermed er SSN-nummeret $20166$.

Merk at kontrollsifferet avhenger av hvilken operasjonstabell som brukes. Med Operasjonstabell 2 får vi $e = 3$ for det samme basis-ID-nummeret $2016$, og hele SSN-nummeret blir $20163$.

$$\begin{array}{c} \begin{aligned} 2016 & \\ \Downarrow & \; \text{+kontrollsiffer med Operasjonstabell 2} \\ 20163 & \\ \Downarrow & \; \text{menneskelige feil} \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{Endring av ett enkelt siffer}} \\[10pt] \overbrace{\mathbf{02}163 \quad 2\mathbf{10}63 \quad 20\mathbf{61}3 \quad 201\mathbf{36}}^{\text{Ombytting av to nabosifre}} \end{array}} \end{array}$$

Figur B.1. To typer vanlige menneskelige feil

Formålet med å legge til kontrollsifferet er å oppdage menneskelige feil ved skriving eller inntasting av SSN-numre. Følgende funksjon check kan oppdage visse menneskelige feil. For et femsifret tall $abcde$ er funksjonen check definert slik.

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

Denne funksjonen returnerer $0$ for et gyldig SSN. Det skyldes at hvert diagonalelement i en operasjonstabell er $0$, og at vi for et gyldig SSN har $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.$$

På den annen side betyr en verdi ulik null fra check at det oppgitte nummeret ikke kan være et gyldig SSN. Merk at avhengig av hvilken operasjonstabell som brukes, kan funksjonen check returnere $0$ også for et ugyldig SSN. Hvilke typer feil som oppdages, avhenger av operasjonstabellen som brukes; tabellen avgjør kvaliteten på feildeteksjonen.

Bymyndighetene ønsker å oppdage to typer vanlige menneskelige feil i siffersekvenser: endring av ett enkelt siffer og ombytting av to nabosifre, som vist i Figur B.1.

En operasjonstabell er god dersom den kan oppdage alle vanlige feil av de to typene på alle SSN-numre laget ut fra de firesifrede basis-ID-numrene 0000–9999. Merk at feil i kontrollsifferet, så vel som i de fire basis-ID-sifrene, skal oppdages. For eksempel er Operasjonstabell 1 god. Operasjonstabell 2 er ikke god fordi $\operatorname{check}(20613)$ er $0$ for $20613$, som er et nummer oppnådd ved å bytte om det 3. og det 4. sifferet i et gyldig SSN $20163$. Faktisk klarer Operasjonstabell 2 blant de $10000$ basis-ID-numrene ikke å oppdage én eller flere vanlige feil for så mange som $3439$ basis-ID-numre.

Gitt en operasjonstabell, avgjør hvor god den er ved å telle antall basis-ID-numre som den gitte tabellen ikke klarer å oppdage én eller flere vanlige feil for.

Inndata

Inndata består av ett enkelt testtilfelle på følgende format.

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

Inndata beskriver en operasjonstabell der $x_{ij}$ er desimalsifferet i rad $i$ og kolonne $j$. Hver linje tilsvarer en rad i tabellen, der elementene er atskilt med ett enkelt mellomrom. Diagonalelementene $x_{ii}$ ($i = 0, \ldots, 9$) er alltid $0$.

Utdata

Skriv ut antall basis-ID-numre som den gitte tabellen ikke klarer å oppdage én eller flere vanlige menneskelige feil for.

Eksempler

Inndata 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

Utdata 1

0

Inndata 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

Utdata 2

3439

Inndata 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

Utdata 3

9995

Inndata 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

Utdata 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.