Oke gw bakal bahas secara singkat soal-soalnya disini. Pembahasan ini cukup singkat, jadi kalau ada yang kurang ngerti, jangan ragu-ragu untuk nanya, bisa comment di post ini, atau kirim e-mail ke gw
Hasil Maret TOKI OpenContest bisa dilihat disini
Soal sudah diupload di “Bundel Soal”. Klik disini
1. Menghitung Game (Jonathan Irvin Gunawan,2012)
Risan bilang ini soal paling gampang di kontes kali ini. Beliau bilang ini soal bonus buat kontesnya. Intinya kan kalau di papan ada N batu, kita bisa sisakan N/X batu di papan, dimana X adalah faktor prima dari N (N juga termasuk X). Ya sudah, tinggal hitung jumlah pangkat faktor prima dari X.
Asumsikan jumlah pangkat faktor prima dari N adalah M. Jika M ganjil, maka Anda pemain pertama jelas bisa memenangkan permainan. Sebaliknya jika M genap, pemain pertama terpaksa menyerah. Untuk M ganjil, anda hanya cukup mencari faktor prima terkecilnya.
Kompleksitas O(sqrt(N))
15 peserta mendapatkan Accepted untuk soal ini.
2. Menghitung Nilai (Jonathan Irvin Gunawan,2012)
Berbeda dengan Risan, writer menganggap ini soal bonusnya. Terus terang, ketika soal ini diketik awalnya cuma cari maksimal aja (karena pas itu writer belum kepikir nilai minimalnya gimana :p). Entah dapat ide darimana tiba-tiba writer terpikir solusi untuk nilai minimalnya, ya sudah soalnya diganti jadi minimal dan maksimal :p
Mencari nilai maksimal itu mudah sekali. Untuk tiap pilihan (anggap pilihan ke-i), kita hanya bisa memperoleh nilai sebanyak min(JawabanBenar[i],JawabanAnda[i]).
Maka, nilai maksimal dirumuskan jumlah semua minimal dari jawaban benar untuk pilihan ke-i, dan jawaban anda untuk pilihan ke-i.
Nilai minimal bisa diperoleh dari max(max(JawabanBenar[i] + JawabanAnda[i] – N),0)
Kompleksitas O(N)
15 peserta mendapatkan Accepted untuk soal ini
3. Menghitung Kata (Jonathan Irvin Gunawan,2012)
Ini adalah soal tersulit di kontes bulan ini. Hanya 6 submission yang mendapatkan verdict Accepted.
Subtask 1 dan 2 (1 <= N <= 20)
Kita bisa membruteforce segala kemungkinan string berisi ‘o’ dan ‘x’, dan tiap string yang kita peroleh, kita bisa cek apakah string tersebut berupa kata atau tidak. Pengecekan bisa me-looping dari 2,3,5,7,11,13,17,19. Kompleksitas tiap pengecekan O(N). Kompleksitas total O(2 ^ N x N).
Untuk mendapatkan nilai di subtask berikutnya, ada lemma yang harus diketahui.
Lemma : Diberikan string X. Bila untuk setiap substring dari X yang memiliki panjang 3 karakter, banyaknya ‘o’ tidak lebih sedikit dari ‘x’, maka X pasti sebuah kata.
Bukti : Jika untuk substring dengan panjang 3 karakter valid, maka substring dengan panjang 2 karakter pasti valid. Semua bilangan bulat positif lebih besar dari 1, dapat direpresentasikan dalam 2x + 3y (x dan y bilangan bulat). Sehingga, untuk semua bilangan prima lebih besar dari 3 pun pasti valid.
Asumsikan banyaknya kata yang bisa dibentuk dengan panjang N adalah f(N). Maka ada dua kemungkinan yang bisa dilakukan.
Jika kita pasang ‘o’ pada karakter pertama, maka karakter berikutnya bebas, ini akan menjadi permasalahan yang sama, namun lebih kecil, yaitu f(N-1)
Jika kita pasang ‘x’ pada karakter pertama, maka dua karakter berikutnya harus ‘o’. Ini akan menjadi f(N-3)
Sehingga f(N) bisa dirumuskan f(N) = f(N-1) + f(N-3). Dengan basis f(0) = 1, f(1) = 2, dan f(2) = 3
Subtask 3 dan 4 (1 <= N <= 1 000 000)
Untuk mendapatkan subtask ini, Anda bisa menggunakan Dynamic Programming. Anda bisa iterasi dari 3..N.
Subtask 5 dan 6 (1 <= N <= 1 000 000 000 000)
Untuk subtask ini, kita harus menggunakan perpangkatan matriks.
Perhatikan perkalian matriks ini :
Perkalian matriks tersebut akan menghasilkan
(f(n+1) f(n+2) f(n) + f(n+2)) = (f(n+1) f(n+2) f(n+3))
Jika matriks ini kita kalikan sekali lagi, kita akan mendapatkan
(f(n+2) f(n+3) f(n+4))
Sehingga, bisa dirumuskan 
Mencari perpangkatan matriks bisa menggunakan pangkat cepat dalam O(lg N). Total kompleksitas O(3^3 x log N)
6 peserta mendapatkan Accepted untuk soal ini
4. Menghitung Belok (Jonathan Irvin Gunawan,2011)
Perhatikan bahwa tiap bergerak ke timur sekali, Irvin Ganteng memiliki 3 kemungkinan langkah, yaitu berbelok keatas, lurus, atau berbelok ke bawah.
Subtask 1 dan 2 (1 <= R,C <= 10)
Solusi naif bisa digunakan. Kita bisa mem-bruteforce segala kemungkinan gerakan tiap bergerak ke timur.
Asumsikan f(i,j) adalah banyaknya belok minimal yang masih dibutuhkan ketika berada di kotak (i,j). f(i,j) bisa direkursikan sebagai berikut
f(i,j) = f(i,j+1)
Jika tidak ada batu di (i+1,j+1) f(i,j) = min(f(i,j) , f(i+1,j+1) + 1)
Ini membandingkan apakah lebih baik maju kedepan, atau berbelok.
Jika tidak ada batu di (i-1,j+1) f(i,j) = min(f(i,j) , f(i-1,j+1) + 1)
Kompleksitas O(R x 3^C).
Subtask 3 dan 4 (1 <= R,C <= 1000)
Gunakan Dynamic Programming untuk soal ini.
Perhatikan bahwa untuk setiap pengecekan f(i,j) dan f(i+1,j).
f(i,j) akan mengecek f(i-1,j+1), f(I,j+1), dan f(i+1,j+1)
f(i+1,j) akan mengecek f(I,j+1), f(i+1,j+1), dan f(i+2,j+1)
Akan ada dua f() yang dihitung dua kali. Kita bisa menggunakan DP untuk menyimpan nilai yang sudah dihitung agar nilai f() yang memiliki parameter sama tidak usah dihitung lagi.
12 peserta mendapatkan Accepted untuk soal ini