Dengan bilangan bulat N , hitung berapa banyak cara yang dapat diekspresikan sebagai produk dari M bilangan bulat> 1.
Masukan hanya N dan M , dan output adalah jumlah total yang berbeda kelompok integer. Berarti Anda dapat menggunakan bilangan bulat lebih dari sekali, tetapi setiap grup harus berbeda ( 3 x 2 x 2
tidak akan dihitung jika 2 x 2 x 3
ada).
Kendala
1 < N <2 31
1 < M <30
Contohnya
Input 30 2
memberi output 3
, karena dapat diekspresikan 3 cara:
2 x 15
3 x 10
5 x 6
Input 16 3
menghasilkan output 1
, karena hanya ada satu grup yang berbeda:
2 x 2 x 4
Input 2310 4
menghasilkan output 10
:
5 x 6 x 7 x 11
3 x 7 x 10 x 11
3 x 5 x 11 x 14
3 x 5 x 7 x 22
2 x 7 x 11 x 15
2 x 5 x 11 x 21
2 x 5 x 7 x 33
2 x 3 x 11 x 35
2 x 3 x 7 x 55
2 x 3 x 5 x 77
Input 15 4
memberi output 0
, karena tidak bisa dilakukan.
Aturan
Berlaku celah kode golf standar, bersama dengan definisi standar untuk input / output. Jawaban dapat berupa fungsi atau program lengkap. Fungsi bawaan untuk faktorisasi dan / atau partisi tidak diizinkan, tetapi yang lain baik-baik saja. Kode dihitung dalam byte.
Jawaban:
Pyth -
24232221 byteBukan solusi yang rumit. Akan lebih banyak bermain golf. Hanya mengambil produk cartesian dari daftar dan filter. Strategi yang sama dengan @optimizer (saya menduga karena komentarnya, tidak benar-benar menguraikan CJam itu) Terima kasih kepada @FryAmTheEggman untuk 2 byte dan trik dengan M.
Menentukan fungsi
g
dengan argsG
danH
Bekerja pada semua argumen pengujian kecuali yang terakhir, terlalu lambat untuk yang satu itu tetapi tidak ada batas waktu yang diberikan.
sumber
M
yang menentukan fungsig
2 argumen,G
danH
. Ini adalah apa yang saya dapatkan selama ini:Ml{msdfqu*GHT1G^r2GH
. Selalu menyenangkan untuk melihat pengguna Pyth lain :)72 3
, yang mengembalikan 5, tetapi sebenarnya ada 6 jawaban,(2, 2, 18), (2, 3, 12), (2, 4, 9), (2, 6, 6), (3, 3, 8)
Python 3, 59
Kami menghitung pembagi potensial
i
. Dengan argumen tambahani
sebagai pembagi terendah yang diizinkan, relasi inti rekursif adalahUntuk setiap
i
, kami memilih untuk memasukkannya (mungkin karena mengulang), dalam hal ini kita membagi produk yang dibutuhkanN
olehi
dan penurunanM
. Jika tidak, kami bertambahi
1, tetapi hanya jikai<N
, karena tidak ada gunanya memeriksa pembagi lebih dariN
.Ketika pembagi minimum
i
melebihiN
, tidak ada lagi pembagi potensial. Jadi, kami memeriksa apakah kami berhasil melihat apakahM==0 and N==1
, atau, ekuivalen,M+1==N==1
atauM+1==N<2
, sejak kapanM+1==N
, nilai timbal balik dijamin menjadi bilangan bulat positif (terima kasih kepada FryAmTheEggman untuk pengoptimalan ini).Kode ini akan menyebabkan stack overflow
N
sekitar 1000 pada kebanyakan sistem, tetapi Anda dapat menjalankannya di Stackless Python untuk menghindari hal ini. Selain itu, ini sangat lambat karena percabangan rekursif eksponensial.sumber
-~M==N<2
M
danN
. Terima kasih!Ruby, 67
Sebenarnya cukup efisien untuk definisi rekursif. Untuk setiap pasangan pembagi
[d,q]
n, dengand
yang lebih kecil, kami menjumlahkan hasilnyaf[q,m-1]
. Bagian yang sulit adalah bahwa dalam panggilan batin, kita membatasi faktor yang lebih besar atau sama dengan d sehingga kita tidak berakhir dengan penghitungan ganda.sumber
CJam, 48 byte
Ini bisa menjadi jauh lebih pendek tetapi saya telah menambahkan cek tertentu untuk membuatnya bekerja untuk jumlah yang layak
M
di kompiler online.Cobalah online di sini
sumber
2 1
. Output yang diharapkan: 1. Output aktual: 0.T-SQL
456373Saya yakin ini akan pecah ketika inputnya bahkan mendekati besar.
Terima kasih kepada @MickyT karena telah membantu menyelamatkan banyak karakter dengan CONCAT dan SELECTing alih-alih beberapa SET.
sumber
SET @C+=',# A'+@
danSET @D+='*A'+@+'.A'SET @E+=' AND A'+(@-1)+'.A<=A'+@+'.A'
SET @C+=@D+'=@N'+@E+' SELECT @'
. Ada@N
di dalam tanda kutip membuatnya di luar lingkup ketika Anda mengeksekusi@C
. Juga saya pikir Anda akan berakhir menghitung duplikatCONCAT
untuk membangun string Anda. Maka Anda dapat menjatuhkanCONVERT
s. CobaSELECT @+=1,@C+=CONCAT(...),@D+=CONCAT(...),@E+=CONCAT(...)
diWHILE
lingkaran Anda . Haruskah Anda menghemat jumlah yang wajar