My first Magazine pemrograman-kompetitif-dasar | Page 16

1 Perkenalan Pemrograman Kompetitif √ merupakan bilangan kuadrat, artinya N dapat dibagi habis oleh N. Khusus pembagi akar ini √ tidak memiliki pasangan, karena √ N N = N. Perhatikan contoh berikut: Jika N = 16, maka: • Karena 1 membagi habis 16, maka • Karena 2 membagi habis 16, maka • 4 membagi habis 16, tetapi karena 16 1 = 16 juga membagi habis 16 16 2 = 8 juga membagi habis 16 16 4 juga 4, maka pembagi ini tidak memiliki pasangan. Maka kita bisa simpulkan bahwa lampu menyala jika dan hanya jika N merupakan bilangan kuadrat. Untuk √ menentukan apakah N merupakan bilangan kuadrat, kita dapat menghitung pembulatan dari N, sebut saja s. Kemudian menghitung s × s lagi. Jika kita mendapatkan kembali N, maka N adalah bilangan kuadrat. Sebagai contoh: √ • N = 8, maka 8 ≈ 2.828427, dibulatkan menjadi 3. Hasil dari 3 × 3 bukan 8, maka 8 bukan bilangan kuadrat. √ • N = 9, maka 9 = 3, dibulatkan menjadi 3. Hasil dari 3 × 3 adalah 9, maka 9 adalah bilangan kuadrat. √ • N = 10, maka 10 ≈ 3.162277, dibulatkan menjadi 3. Hasil dari 3 × 3 bukan 10, maka 10 bukan bilangan kuadrat. Implementasinya sangat sederhana: # include < iostream > # include < cmath > using namespace std ; int main () { long long N ; cin >> N ; long long s = round ( sqrt ( N )); if ( s * s != N ) { cout << " lampu ␣ mati " << endl ; } else { cout << " lampu ␣ menyala " << endl ; } } Program ini tidak memiliki perulangan sama sekali, dan hanya memanggil fungsi bawaan C++ untuk mengakarkan bilangan. Program di atas dapat menyelesaikan permasalahan hingga kasus terbesar N = 10 18 hanya dalam hitungan milisekon saja! Melalui penyelesaian soal ini, kita mempelajari bahwa solusi yang naif belum tentu cukup untuk menyelesaikan soal. Bahkan, solusi yang lebih rumit belum tentu mendapatkan penilaian sempurna. Dibutuhkan analisis yang mendalam hingga didapatkan strategi penyelesaian yang efisien. 6