My first Magazine pemrograman-kompetitif-dasar | Page 14

1 Perkenalan Pemrograman Kompetitif Untuk masukan N, program sederhana ini melakukan N buah pengecekan. Artinya pada kasus terburuk, program tersebut akan melakukan N = 10 18 buah pengecekan! Jika kita asumsikan komputer sekarang dapat melakukan 10 8 operasi per detik, program ini memerlukan waktu 10 tahun untuk menyelesaikan hitungan! Program ini hanya akan bekerja untuk nilai N yang kecil. Untuk N yang lebih besar, misalnya N = 10 9 , kemungkinan besar diperlukan waktu lebih dari 1 detik. Solusi ini tidak akan mendapatkan nilai penuh, atau bahkan 0, tergantung skema penilaian yang digunakan. 1.3.2 Solusi yang Lebih Baik Dengan sedikit observasi, yang sebenarnya perlu dilakukan adalah menghitung banyaknya pembagi dari N. Apabila banyaknya pembagi ganjil, berarti pada akhirnya lampu di ruangan ke-N akan menyala. Demikian pula sebaliknya, apabila genap, berarti lampu di ruangan ke-N akan mati. Diperlukan suatu cara untuk menghitung banyaknya pembagi dari N dengan efisien. Salah satu caranya adalah dengan melakukan faktorisasi prima terlebih dahulu. Misalkan untuk N = 12, maka faktorisasi primanya adalah 2 2 × 3. Berdasarkan faktorisasi prima ini, suatu bilangan merupakan pembagi dari 12 apabila dipenuhi: • Memiliki faktor 2 maksimal sebanyak 2. • Memiliki faktor 3 maksimal sebanyak 1. • Tidak boleh memiliki faktor lainnya. Sebagai contoh, berikut daftar seluruh pembagi dari 12: • • • • • • 1 = 2 0 × 3 0 2 = 2 1 × 3 0 3 = 2 0 × 3 1 4 = 2 2 × 3 0 6 = 2 1 × 3 1 12 = 2 2 × 3 1 Banyaknya pembagi dari 12 sebenarnya sama saja dengan banyaknya kombinasi yang bisa dipilih dari {2 0 , 2 1 , 2 2 } dan {3 0 , 3 1 }. Banyaknya kombinasi sama dengan mengalikan banyaknya elemen pada tiap-tiap himpunan. Sehingga, banyaknya cara adalah 3 × 2 = 6 cara. Dengan demikian, banyaknya pembagi dari 12 adalah 6. Cara ini juga berlaku untuk nilai N yang lain. Misalnya N = 172.872 = 2 3 × 3 2 × 7 4 . Berarti banyak pembaginya adalah 4 × 3 × 5 = 60. Secara umum, banyaknya pembagi dari: N = a 1 p 1 × a 2 p 2 × a 3 p 3 × ... × a k p k adalah: (1 + p 1 ) × (1 + p 2 ) × (1 + p 3 ) × ... × (1 + p k ) Jadi pencarian banyaknya pembagi dapat dilakukan dengan melakukan faktorisasi prima pada N, lalu hitung banyak pembaginya dengan rumus tersebut. Anda cukup melakukan pengecekan √ sampai N saja untuk melakukan faktorisasi bilangan N. Berikut adalah implementasi solusi ini dalam C++: 4