QOJ.ac

QOJ

Süre Sınırı: 1 s Bellek Sınırı: 512 MB Toplam puan: 100 Zorluk: [göster] Hack'lenebilir ✓

#174. คุณภาพของเลขโดดตรวจสอบ

İstatistikler

เมืองเล็กๆ ที่คุณอาศัยอยู่มีแผนจะนำระบบหมายเลขประกันสังคม (SSN) แบบใหม่มาใช้ พลเมืองแต่ละคนจะถูกระบุตัวตนด้วยหมายเลข SSN ห้าหลัก โดยสี่หลักแรกระบุหมายเลข ID พื้นฐาน (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$ สำหรับหมายเลข ID พื้นฐานสี่หลัก $abcd$ จะคำนวณโดยใช้สูตรต่อไปนี้ ในที่นี้ $i \otimes j$ แทนสมาชิกของตารางในแถวที่ $i$ และคอลัมน์ที่ $j$

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

ตัวอย่างเช่น เมื่อใช้ตารางการดำเนินการ 1 เลขโดดตรวจสอบ $e$ สำหรับหมายเลข ID พื้นฐาน $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 เราจะได้ $e = 3$ สำหรับหมายเลข ID พื้นฐาน $2016$ เดียวกัน และหมายเลข 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$$

ฟังก์ชันนี้จะคืนค่า $0$ สำหรับหมายเลข SSN ที่ถูกต้อง ทั้งนี้เพราะสมาชิกในแนวทแยงมุมหลักทุกตัวในตารางการดำเนินการเป็น $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 ที่สร้างจากหมายเลข ID พื้นฐานสี่หลัก 0000–9999 สังเกตว่าความผิดพลาดที่เกิดกับเลขโดดตรวจสอบรวมถึงที่เกิดกับเลขโดด ID พื้นฐานทั้งสี่หลักจะต้องถูกตรวจพบได้ ตัวอย่างเช่น ตารางการดำเนินการ 1 เป็นตารางที่ดี ส่วนตารางการดำเนินการ 2 ไม่ดี เพราะสำหรับ $20613$ ซึ่งเป็นหมายเลขที่ได้จากการสลับเลขโดดหลักที่ 3 และหลักที่ 4 ของหมายเลข SSN ที่ถูกต้อง $20163$ ค่า $\operatorname{check}(20613)$ เป็น $0$ อันที่จริง ในบรรดาหมายเลข ID พื้นฐาน $10000$ หมายเลข ตารางการดำเนินการ 2 ไม่สามารถตรวจหาความผิดพลาดที่พบบ่อยอย่างน้อยหนึ่งรายการได้มากถึง $3439$ หมายเลข ID พื้นฐาน

กำหนดตารางการดำเนินการมาให้หนึ่งตาราง จงพิจารณาว่าตารางนั้นดีเพียงใดโดยการนับจำนวนหมายเลข ID พื้นฐานที่ตารางที่กำหนดไม่สามารถตรวจหาความผิดพลาดที่พบบ่อยอย่างน้อยหนึ่งรายการได้

ข้อมูลนำเข้า

ข้อมูลนำเข้าประกอบด้วยชุดทดสอบเดียวในรูปแบบต่อไปนี้

$$\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$ เสมอ

ข้อมูลส่งออก

ให้แสดงจำนวนหมายเลข ID พื้นฐานที่ตารางที่กำหนดไม่สามารถตรวจหาความผิดพลาดของมนุษย์ที่พบบ่อยอย่างน้อยหนึ่งรายการได้

ตัวอย่าง

ข้อมูลนำเข้า 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.