N'yi M tamsayılarının bir ürünü olarak yazmanın kaç yolu vardır?


12

N tamsayısı verildiğinde , M tamsayılarının> 1 çarpımı olarak kaç yolla ifade edilebileceğini sayın .

Girdi basitçe N ve M'dir ve çıktı ayrı tamsayı gruplarının toplam sayısıdır . Yani bir tam sayıyı bir kereden fazla kullanabilirsiniz, ancak her grup farklı olmalıdır ( 3 x 2 x 2varsa sayılmaz 2 x 2 x 3).

Kısıtlamalar

1 < N <2 31
1 < M <30

Örnekler

Girdi 30 2çıktı verir 3, çünkü 3 şekilde ifade edilebilir:

2 x 15
3 x 10
5 x 6

Yalnızca bir ayrı grup olduğu için girdi 16 3çıktı verir 1:

2 x 2 x 4

Girdi 2310 4çıktı verir 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

Girdi 15 4çıktı verir 0bu yapılamaz çünkü.

kurallar

Standart kod golf boşlukları, giriş / çıkış için standart tanımlarla birlikte uygulanır. Yanıtlar bir işlev veya tam program olabilir. Çarpanlara ayırma ve / veya bölümleme için yerleşik işlevlere izin verilmez, ancak diğerleri iyidir. Kod bayt olarak sayılır.


Bölümleme ile ne demek istiyorsun?
Doktor

@Optimizer Bir listeyi çakışmayan alt listelere gruplama. Mathematica gibi bazı dillerde yerleşik olarak bulunur .
Geobits

Zaman sınırı var mı? Özellikle saf bir algoritma, M'nin büyük bir değeri için yüzyıllar sürebilirdi.
Level River St

1
@ steveverrill N üzerindeki üst sınır göz önüne alındığında, maksimum 30 (asal) faktör olmalıdır, bu da işleri biraz hızlandırır. Ancak, saf olmaktan çekinmeyin. Algoritmanızın birkaç saat içinde cevap vermesi muhtemel değilse, iyi açıklanmış bir kavram kanıtı seçmenlerin karar vermesine yardımcı olabilir.
Geobits

iki listenin kartezyen ürün yapmanıza izin veren bir yerleşik?
Doktor

Yanıtlar:


5

Pyth - 24 23 22 21 bayt

Karmaşık bir çözüm değil. Daha fazla golf olacak. Sadece listelerin ve filtrelerin kartezyen ürününü alır. @Optimizer ile aynı strateji (Onun yorumu nedeniyle tahmin ediyorum, aslında CJam deşifre etmedi) 2 bayt için @FryAmTheEggman sayesinde ve M ile hile

Ml{m`Sdfqu*GHT1G^r2GH

gArgs Gve ile bir fonksiyon tanımlar.H

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

Sonuncusu hariç tüm test argümanlarında çalıştı, bu konuda çok yavaştı, ancak zaman sınırı yok.


Giriş bu formatta iyi.
Geobits

1
Pyth golf ipucu: 2 argüman alırsanız, genellikle 2 argümanın Mişlevini tanımlayan daha kısa ve . Bu Bunun için elde ediyoruz: . Her zaman başka bir Pyth kullanıcısı görmek güzel :)gGHMl{msdfqu*GHT1G^r2GH
FryAmTheEggman

@FryAmTheEggman bahşiş için teşekkürler.
Maltysen

1
Bu 72 3, 5 döndüren giriş için yanlış bir cevap veriyor gibi görünüyor , ancak aslında 6 cevap var(2, 2, 18), (2, 3, 12), (2, 4, 9), (2, 6, 6), (3, 3, 8)
isaacg

1
@isaacg oh tamam, 21 karakterlik versiyonuma geri döneceğim. Toplamanın işe yarayacağını düşünmüyordum ama öyle görünüyordu, bu yüzden repr'e geri döneceğim. Yakaladığınız için teşekkürler.
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

Potansiyel bölenleri sayıyoruz i. iİzin verilen en düşük bölen olan ek argüman ile çekirdek özyinelemeli ilişki

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

Her biri için i, biz, ki bu durumda biz istenilen ürünü bölmek, bu: (a tekrar mümkün) gibi tercih Nile ive azaltma M. Eğer yapmazsak, i1 i<Nartarız , ama sadece eğer daha büyük bölücülerin kontrolünün kullanılmadığı için N.

Minimum bölen iaşıldığında N, artık potansiyel bölen yoktur. Bu nedenle, başarılı olup olmadığımızı M==0 and N==1veya eşdeğer olarak mı, M+1==N==1yoksa karşılıklı değerin M+1==N<2ne zaman M+1==Npozitif bir tamsayı olacağını garanti edip etmediğimizi kontrol ediyoruz (bu optimizasyon için FryAmTheEggman sayesinde).

Bu kod N, çoğu sistemde yaklaşık 1000 için yığın taşmasına neden olur , ancak bunu önlemek için Stackless Python'da çalıştırabilirsiniz . Ayrıca, üstel özyinelemeli dallanması nedeniyle son derece yavaştır.


Sanırım kullanabilirsiniz-~M==N<2
FryAmTheEggman

@FryAmTheEggman Bunun yanlış pozitifler vereceğini düşündüm, ama aslında Mve üzerindeki ortak kısıtlamalar sayesinde işe yarıyor N. Teşekkürler!
xnor

4

Yakut, 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}

Aslında özyinelemeli bir tanım için makul derecede etkilidir. [d,q]N'nin her bir bölen çifti diçin, daha küçük olanı ile, sonucunu toplamız f[q,m-1]. Zor olan kısım, iç çağrılarda, faktörleri d'den büyük veya eşit olanlarla sınırlandırmamızdır, böylece çift saymaya son vermeyiz.

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 

2

CJam, 48 bayt

Bu çok daha kısa olabilir, ancak Mçevrimiçi derleyicide iyi sayıda çalışmasını sağlamak için bazı kontroller ekledim .

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

Buradan çevrimiçi deneyin


Bu adamcağız. Girişi deneyin 2 1. Beklenen çıktı: 1. Gerçek çıktı: 0.
Peter Taylor

@PeterTaylor Sigh. Sabit.
Doktor

2

T-SQL 456 373

Eminim girişler büyük olmaya yaklaştığında bu kesilecektir.

Birden çok SET yerine CONCAT ve SELECTing ile birçok karakteri kaydetmeye yardımcı olduğu için @MickyT'a teşekkürler.

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)

Bunu kaldırmak istiyorum, ama test etmek için basit bir yol bulamıyorum. Herhangi bir fikir? Üçüncü tarafın işe yaradığına dair onay da iyidir.
Geobits

Çalıştırdığımız birkaç dönüşüm hatası alıyorum (2012). Bu ifadelerden gibi görünüyorlar SET @C+=',# A'+@veSET @D+='*A'+@+'.A'SET @E+=' AND A'+(@-1)+'.A<=A'+@+'.A'
MickyT

Ayrıca düzeltmeniz gerekecek SET @C+=@D+'=@N'+@E+' SELECT @'. The @Ntırnak içinde yürüttüğünüzde onu kapsam dışında yapar @C. Ayrıca yinelenen sayma sona erecek düşünüyorum
MickyT

Şimdi 2012'de test ettim. Çalışmalı.
Ocak'ta

2
Şimdi iyi çalışıyor :) Bazı karakterleri tıraş edebileceğiniz birkaç yer. CONCATDizelerinizi oluşturmak için kullanmayı deneyin . Sonra CONVERTs bırakabilirsiniz . Deneyin SELECT @+=1,@C+=CONCAT(...),@D+=CONCAT(...),@E+=CONCAT(...)sizin de WHILEdöngü. Size makul bir sayı kaydetmelisiniz
MickyT
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.