Sebuah jumlah Bell ( Oei A000110 ) adalah sejumlah cara untuk partisi satu set n berlabel (berbeda) elemen. Nomor Bell 0 didefinisikan sebagai 1.
Mari kita lihat beberapa contoh (saya menggunakan tanda kurung untuk menunjukkan subset dan kurung untuk partisi):
1: {1}
2: {[1,2]}, {[1],[2]}
3: {[1,2,3]}, {[1,2],[3]}, {[1,3],[2]}, {[2,3],[1]}, {[1],[2],[3]}
Ada banyak cara untuk menghitung nomor Bell, dan Anda bebas untuk menggunakannya. Satu cara akan dijelaskan di sini:
Cara termudah untuk menghitung nomor Bell adalah dengan menggunakan segitiga nomor yang menyerupai segitiga Pascal untuk koefisien binomial. Nomor Bell muncul di tepi segitiga. Dimulai dengan 1, setiap baris baru dalam segitiga dibangun dengan mengambil entri terakhir di baris sebelumnya sebagai entri pertama, dan kemudian mengatur setiap entri baru ke tetangga kirinya ditambah tetangga kiri atas:
1
1 2
2 3 5
5 7 10 15
15 20 27 37 52
Anda dapat menggunakan pengindeksan 0 atau pengindeksan 1. Jika Anda menggunakan pengindeksan-0, sebuah input 3
harus di-output 5
, tetapi harus di-output 2
jika Anda menggunakan pengindeksan-1.
Program Anda harus bekerja hingga nomor Bell 15, mengeluarkan 1382958545
. Secara teori, program Anda harus dapat menangani angka yang lebih besar (dengan kata lain, jangan membuat hardcode solusinya).
EDIT: Anda tidak diharuskan untuk menangani input 0 (untuk pengindeksan 0) atau 1 (untuk pengindeksan 1) karena tidak dihitung dengan metode segitiga.
Kasus uji (dengan asumsi 0-indexing):
0 -> 1 (OPTIONAL)
1 -> 1
2 -> 2
3 -> 5
4 -> 15
5 -> 52
6 -> 203
7 -> 877
8 -> 4140
9 -> 21147
10 -> 115975
11 -> 678570
12 -> 4213597
13 -> 27644437
14 -> 190899322
15 -> 1382958545
Jawaban menggunakan metode bawaan (seperti BellB [n] dalam Bahasa Wolfram) yang secara langsung menghasilkan nomor Bell akan menjadi tidak kompetitif.
Kode terpendek (dalam byte) menang.
3
harus keluar 2
. Lalu apa yang akan input 1
berikan dengan pengindeksan 1?
3
harus menampilkan5
Ini akan keluar15
, kan? Dan dengan 1-pengindeksan itu akan menampilkan5