My first Magazine pemrograman-kompetitif-dasar | Page 15
1.3 Contoh Soal Pemrograman Kompetitif
# include < iostream >
using namespace std ;
int main () {
long long N ;
cin >> N ;
long long num = N ;
int divisorCount = 1;
for ( long long i = 2; i * i <= num ; i ++) {
int factorCount = 0;
while ( num % i == 0) {
factorCount ++;
num /= i ;
}
divisorCount *= (1 + factorCount );
}
if ( num > 1) { // Sisa faktor
divisorCount *= 2;
}
if ( divisorCount % 2 == 0) {
cout << " lampu ␣ mati " << endl ;
} else {
cout << " lampu ␣ menyala " << endl ;
}
}
√
Karena pengecekan hanya dilakukan hingga N saja untuk melakukan faktorisasi bilangan
N, maka perhitungan dapat dilakukan di bawah 1 detik untuk N sampai 10 16 . Namun, untuk 10 18 ,
kemungkinan program masih memerlukan waktu di atas 1 detik.
1.3.3
Solusi yang Lebih Baik Lagi!
Ternyata, masih ada solusi yang lebih baik dibandingkan dengan solusi menggunakan fak-
torisasi prima. Perhatikan bahwa kita tidak perlu tahu berapa banyak pembagi bilangan N. Kita
hanya perlu tahu apakah N memiliki pembagi sebanyak ganjil atau genap.
Jika suatu bilangan, sebut saja x membagi habis N, maka otomatis
habis N. Perhatikan contoh berikut:
N
x
juga akan membagi
Jika N = 12, maka:
• Karena 1 membagi habis 12, maka
• Karena 2 membagi habis 12, maka
• Karena 3 membagi habis 12, maka
12
1
12
2
12
3
= 12 juga membagi habis 12
= 6 juga membagi habis 12
= 4 juga membagi habis 12
Dengan demikian, secara umum pembagi bilangan selalu memiliki pasangan, kecuali jika
N merupakan bilangan kuadrat, misalnya 4, 9, 16 dan seterusnya. Mengapa demikian? Jika N
5