Statement
สรุปคำถามสำหรับข้อนี้คือ ให้เลขมา เลข จากนั้นนำเลขแต่ละตัวมาหารเอาเศษด้วย แล้วถามว่า หลังจากหารเอาเศษแล้ว มีจำนวนเลขที่แตกต่างกันกี่เลข
Solution
วิธีทำข้อนี้คือลองสังเกตจากคุณสมบัติการหารเอาเศษก่อน กล่าวคือกำหนดให้ เป็นจำนวนเต็มใด ๆ (ลบ ศูนย์ บวก) เมื่อนำเลข มาหารเอาเศษด้วย (เขียนด้วยโค้ด N % M
คือผลจากการนำ มาหารเอาเศษด้วย หรือเขียนให้ทางการหน่อยก็ ) สุดท้ายแล้วจะได้ว่าผลลัพธ์จากการหารเอาเศษมีได้แค่ แบบที่แตกต่างกันเท่านั้นคือ
ตัวอย่างเช่น ให้ จะได้ว่าเมื่อเรานำจำนวนเต็ม อะไรมาก็ตามหารเอาเศษด้วย จะได้ว่า N % 3
ผลลัพธ์จะมีแค่ เท่านั้น เช่นลองไล่เลขมาดังนี้
ทุกผลลัพธ์มันจะเริ่มวนย้อนกลับมาอยู๋ในเลข แล้วนั่นเอง
จากข้อสังเกตนี้ เราสามารถนำมาปรับใช้กับเลข ได้นั่นคือให้ จะได้ว่าผลลัพธ์จากการหารเอาเศษด้วย มีได้แค่เพียง
จากตรงนี้เราสามารถสร้าง array ชื่อ (ย่อมาจาก count ที่แปลว่านับ) มาเก็บข้อมูลการปรากฎของเลขที่ได้จากผลลัพธ์เหล่านี้ได้ ก็จะได้ array มีทั้งหมด ช่องข้อมูล(มี ตั้งแต่ ถึง ) จากนั้นกำหนดให้ทุกช่องมีค่าเป็น ซึ่งหมายถึงว่ายังไม่มีเลขใด(ในช่วง ถึง )ปรากฎเลย
ทีนี้หากเรานำจำนวนเต็มสักตัวมา สมมติชื่อ เราก็นำจำนวนเต็มนั้นไปหารเอาเศษด้วย จะได้ว่าผลลัพธ์มันจะเป็น สักตัวของ แน่ ๆ (มาจากข้อสังเกตการหารเอาเศษ) เราก็จะทำการกำหนดค่า(assign) ให้ ช่อง นั้นเป็น เพื่อบอกว่ามีเลขนี้(num%42
)ปรากฎขึ้นในผลลัพธ์ที่แตกต่างใด ๆ แล้ว(เพราะตอนแรกเป็น ซึ่งหมายถึงยังไม่มีเลขนี้ปรากฏ)
เมื่อเรามีข้อมูลการปรากฎของเลขต่าง ๆ แล้ว คำตอบของโจทย์ข้อนี้ก็คือว่า นับไปทีละเลขตั้งแต่ แล้วดูว่าเลขไหนบ้างที่ค่าของ ในช่องที่ เป็น (ซึ่งหมายถึงว่าเลข ได้ปรากฎแล้ว) ก็บวก เพิ่มเข้าไปในค่าคำตอบ () เพียงเท่านี้ก็จบแล้ว
Code
#include <stdio.h> int main() { int cnt[42] = {}; // สร้างมา 42 ช่องทุกช่องเป็น 0 for (int i = 0; i < 10; i++) { int num; scanf("%d", &num); int index = num % 42; cnt[index] = 1; } int ans = 0; for (int i = 0; i < 42; i++) { if (cnt[i] == 1) { ans += 1; } } printf("%d", ans); return 0; }