Berapa banyak cara untuk menulis N sebagai produk dari bilangan bulat M?

12

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 2tidak akan dihitung jika 2 x 2 x 3ada).

Kendala

1 < N <2 31
1 < M <30

Contohnya

Input 30 2memberi output 3, karena dapat diekspresikan 3 cara:

2 x 15
3 x 10
5 x 6

Input 16 3menghasilkan output 1, karena hanya ada satu grup yang berbeda:

2 x 2 x 4

Input 2310 4menghasilkan 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 4memberi 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.

Geobit
sumber
Apa yang Anda maksud dengan mempartisi?
Pengoptimal
@Optimizer Mengelompokkan daftar ke dalam sublists yang tidak tumpang tindih. Beberapa bahasa memiliki built-in ini, seperti Mathematica .
Geobits
Apakah ada batasan waktu? Algoritma yang sangat naif dapat memakan waktu berabad-abad untuk nilai M. yang besar. Hal-hal sederhana seperti mencatat hanya ada satu faktor yang lebih besar dari sqrt (N) jelas sangat membantu.
Level River St
1
@steveverrill Mengingat batas atas pada N , seharusnya hanya ada 30 (prima) faktor maks, yang mempercepat segalanya sedikit. Namun, jangan ragu untuk bersikap naif. Jika algoritme Anda kemungkinan tidak akan memberikan jawaban dalam beberapa jam, bukti konsep yang dijelaskan dengan baik dapat membantu pemilih memutuskan.
Geobits
built in yang memungkinkan Anda untuk melakukan produk cartesian dari dua daftar diizinkan?
Pengoptimal

Jawaban:

5

Pyth - 24 23 22 21 byte

Bukan 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.

Ml{m`Sdfqu*GHT1G^r2GH

Menentukan fungsi gdengan args GdanH

M                    function definition of g with args G and H
 l                   length of
  {                  set (eliminates duplicates)
   m                 map
    `Sd              repr of sorted factors so can run set (on bash escape ` as \`)
    f                filter
     q      G        equals first arg
      u*GHT1         reduce by multiplication
     ^     H         cartesian product by repeat second arg
       r2G           range 2 to first arg

Bekerja pada semua argumen pengujian kecuali yang terakhir, terlalu lambat untuk yang satu itu tetapi tidak ada batas waktu yang diberikan.

Maltysen
sumber
Masukan baik-baik saja dalam format itu.
Geobit
1
Tip golf Pyth: jika Anda mendapatkan 2 argumen, biasanya lebih pendek untuk digunakan Myang menentukan fungsi g2 argumen, Gdan H. Ini adalah apa yang saya dapatkan selama ini: Ml{msdfqu*GHT1G^r2GH. Selalu menyenangkan untuk melihat pengguna Pyth lain :)
FryAmTheEggman
@FryAmTheEggman memperbarui terima kasih atas tipnya.
Maltysen
1
Ini tampaknya memberikan jawaban yang salah untuk input 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)
isaacg
1
@isaacg oh ok, saya akan mengembalikannya kembali ke versi 21 char saya. Saya tidak berpikir menjumlahkan itu akan berhasil tetapi sepertinya, jadi saya akan kembali ke repr. Terima kasih atas tangkapannya.
Maltysen
9

Python 3, 59

f=lambda N,M,i=2:i<=N and f(N/i,M-1,i)+f(N,M,i+1)or-~M==N<2

Kami menghitung pembagi potensial i. Dengan argumen tambahan isebagai pembagi terendah yang diizinkan, relasi inti rekursif adalah

f(N,M,i)=f(N/i,M-1,i)+f(N,M,i+1)

Untuk setiap i, kami memilih untuk memasukkannya (mungkin karena mengulang), dalam hal ini kita membagi produk yang dibutuhkan Noleh idan penurunan M. Jika tidak, kami bertambah i1, tetapi hanya jika i<N, karena tidak ada gunanya memeriksa pembagi lebih dari N.

Ketika pembagi minimum imelebihi N, tidak ada lagi pembagi potensial. Jadi, kami memeriksa apakah kami berhasil melihat apakah M==0 and N==1, atau, ekuivalen, M+1==N==1atau M+1==N<2, sejak kapan M+1==N, nilai timbal balik dijamin menjadi bilangan bulat positif (terima kasih kepada FryAmTheEggman untuk pengoptimalan ini).

Kode ini akan menyebabkan stack overflow Nsekitar 1000 pada kebanyakan sistem, tetapi Anda dapat menjalankannya di Stackless Python untuk menghindari hal ini. Selain itu, ini sangat lambat karena percabangan rekursif eksponensial.

Tidak
sumber
Saya pikir Anda dapat menggunakan-~M==N<2
FryAmTheEggman
@FryAmTheEggman Saya pikir itu akan memberikan positif palsu, tetapi memang berhasil, berkat kendala bersama Mdan N. Terima kasih!
xnor
4

Ruby, 67

f=->n,m,s=2,r=0{m<2?1:s.upto(n**0.5){|d|n%d<1&&r+=f[n/d,m-1,d]}&&r}

Sebenarnya cukup efisien untuk definisi rekursif. Untuk setiap pasangan pembagi [d,q]n, dengan dyang lebih kecil, kami menjumlahkan hasilnya f[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.

1.9.3-p327 :002 > f[30,2]
 => 3 
1.9.3-p327 :003 > f[2310,4]
 => 10 
1.9.3-p327 :004 > f[15,4]
 => 0 
1.9.3-p327 :005 > f[9,2]
 => 1 
histokrat
sumber
2

CJam, 48 byte

Ini bisa menjadi jauh lebih pendek tetapi saya telah menambahkan cek tertentu untuk membuatnya bekerja untuk jumlah yang layak Mdi kompiler online.

q~\:N),2>{N\%!},a*{_,2/)<m*{(+$}%}*{1a+:*N=},_&,

Cobalah online di sini

Pengoptimal
sumber
Ini buggy. Coba masukan 2 1. Output yang diharapkan: 1. Output aktual: 0.
Peter Taylor
@PeterTaylor Sigh. Tetap.
Pengoptimal
2

T-SQL 456 373

Saya 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.

CREATE PROC Q(@N INT,@M INT)AS
DECLARE @ INT=2,@C VARCHAR(MAX)='SELECT COUNT(*)FROM # A1',@D VARCHAR(MAX)=' WHERE A1.A',@E VARCHAR(MAX)=''CREATE TABLE #(A INT)WHILE @<@N
BEGIN
INSERT INTO # VALUES(@)SET @+=1
END
SET @=1
WHILE @<@M
BEGIN
SELECT @+=1,@C+=CONCAT(',# A',@),@D+=CONCAT('*A',@,'.A'),@E+=CONCAT(' AND A',@-1,'.A<=A',@,'.A')END
SET @C+=CONCAT(@D,'=',@N,@E)EXEC(@C)
tanda
sumber
Saya ingin memperbaiki ini, tetapi saya tidak dapat menemukan cara sederhana untuk mengujinya. Ada ide? Konfirmasi pihak ketiga yang berfungsi juga baik.
Geobits
Saya mendapatkan beberapa kesalahan konversi saat saya menjalankannya (2012). Mereka tampaknya berasal dari pernyataan-pernyataan ini SET @C+=',# A'+@danSET @D+='*A'+@+'.A'SET @E+=' AND A'+(@-1)+'.A<=A'+@+'.A'
MickyT
Anda juga harus memperbaikinya SET @C+=@D+'=@N'+@E+' SELECT @'. Ada @Ndi dalam tanda kutip membuatnya di luar lingkup ketika Anda mengeksekusi @C. Juga saya pikir Anda akan berakhir menghitung duplikat
MickyT
Sekarang saya sudah mengujinya pada tahun 2012. Itu harus bekerja.
menandai
2
Bekerja dengan baik sekarang :) Beberapa tempat di mana Anda dapat mencukur beberapa karakter. Coba gunakan CONCATuntuk membangun string Anda. Maka Anda dapat menjatuhkan CONVERTs. Coba SELECT @+=1,@C+=CONCAT(...),@D+=CONCAT(...),@E+=CONCAT(...)di WHILElingkaran Anda . Haruskah Anda menghemat jumlah yang wajar
MickyT