N को M पूर्णांक के उत्पाद के रूप में लिखने के कितने तरीके हैं?


12

पूर्णांक N को देखते हुए , यह गणना करें कि M पूर्णांक> 1 के उत्पाद के रूप में इसे कितने तरीकों से व्यक्त किया जा सकता है ।

इनपुट केवल एन और एम है , और आउटपुट विभिन्न पूर्णांक समूहों की कुल गणना है । मतलब आप एक से अधिक बार पूर्णांक का उपयोग कर सकते हैं, लेकिन प्रत्येक समूह को अलग होना चाहिए ( 3 x 2 x 2यदि 2 x 2 x 3मौजूद है तो गिनती नहीं होगी )।

प्रतिबन्ध

1 < एन <2 31
1 < एम <30

उदाहरण

इनपुट 30 2आउटपुट देता है 3, क्योंकि इसे 3 तरीके से व्यक्त किया जा सकता है:

2 x 15
3 x 10
5 x 6

इनपुट 16 3आउटपुट देता है 1, क्योंकि केवल एक अलग समूह है:

2 x 2 x 4

इनपुट 2310 4आउटपुट देता है 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

इनपुट 15 4आउटपुट देता है 0, क्योंकि यह नहीं किया जा सकता है।

नियम

इनपुट / आउटपुट के लिए मानक परिभाषाओं के साथ, मानक कोड गोल्फ कमियां लागू होती हैं। उत्तर एक कार्य या पूर्ण कार्यक्रम हो सकता है। निर्मितीकरण और / या विभाजन के लिए निर्मित कार्यों की अनुमति नहीं है, लेकिन अन्य ठीक हैं। कोड को बाइट्स में गिना जाता है।


विभाजन से आपका क्या मतलब है?
ऑप्टिमाइज़र

@ ऑप्टीमाइज़र नॉनवर्लेपिंग सब्लिस्ट्स में एक सूची समूहीकृत करता है। कुछ भाषाओं में इसका निर्माण किया गया है, जैसे कि गणितज्ञ
ज्योबिट्स

क्या कोई समय सीमा है? एक विशेष रूप से भोली एल्गोरिथ्म एम के एक बड़े मूल्य के लिए सदियों लग सकता है। सरल चीजों की तरह वहाँ केवल एक कारक sqrt (एन) से बड़ा हो सकता है स्पष्ट रूप से बहुत मदद करते हैं।
लेवल रिवर सेंट

1
@steveverrill एन पर ऊपरी सीमा को देखते हुए , केवल 30 (प्राइम) कारक अधिकतम होना चाहिए, जो चीजों को बहुत कम गति देता है। हालांकि, अनुभवहीन महसूस करें। यदि आपका एल्गोरिथ्म कुछ घंटों के भीतर जवाब देने की संभावना नहीं है, तो अवधारणा का एक सुस्पष्ट प्रमाण मतदाताओं को निर्णय लेने में मदद कर सकता है।
ज्योबिट्स

एक अंतर्निहित जिसमें आपको दो सूची के कार्टेशियन उत्पाद करने की अनुमति है?
ऑप्टिमाइज़र

जवाबों:


5

पायथ - 24 23 22 21 बाइट्स

जटिल समाधान नहीं। अधिक गोल्फिंग होगी। बस सूचियों और फ़िल्टर का कार्टेशियन उत्पाद लेता है। @Optimizer के रूप में एक ही रणनीति (मैं उनकी टिप्पणी के कारण अनुमान लगा रहा हूं, वास्तव में उस सीजेएम को समझ में नहीं आया) @ बाइट के लिए @FryAmTheEggman धन्यवाद और एम के साथ चाल।

Ml{m`Sdfqu*GHT1G^r2GH

एक फ़ंक्शन gको args Gऔर के साथ परिभाषित करता है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

अंतिम को छोड़कर सभी परीक्षण आर्गों पर काम किया गया था, उस पर बहुत धीमी थी, लेकिन कोई समय सीमा नहीं दी गई है।


इनपुट उस प्रारूप में ठीक है।
जियोबिट्स

1
पायथ गोल्फ टिप: यदि आपको 2 तर्क मिलते हैं, तो यह आमतौर पर उपयोग करने के लिए छोटा होता है Mजो g2 तर्कों के कार्य को परिभाषित करता है, Gऔर H। यह मैं इस के लिए क्या मिलता है: Ml{msdfqu*GHT1G^r2GH। एक और Pyth उपयोगकर्ता को देखकर हमेशा अच्छा लगा :)
FryAmTheEggman

@FryAmTheEggman ने टिप के लिए धन्यवाद अपडेट किया।
माल्टसेन

1
यह इनपुट के लिए एक गलत उत्तर 72 3देता है, जो 5 देता है, लेकिन वास्तव में 6 उत्तर हैं,(2, 2, 18), (2, 3, 12), (2, 4, 9), (2, 6, 6), (3, 3, 8)
isaacg

1
@isaacg ओह ठीक है, मैं इसे वापस अपने 21 चार संस्करण में वापस लाऊंगा। मैंने नहीं सोचा था कि यह काम करेगा, लेकिन ऐसा लग रहा था, इसलिए मैं फिर से जाऊंगा। पकड़ने के लिए धन्यवाद।
माल्टसेन

9

अजगर 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

हम संभावित विभाजकों की गणना करते हैं iiसबसे कम अनुमत भाजक के रूप में अतिरिक्त तर्क के साथ, कोर पुनरावर्ती संबंध है

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

प्रत्येक के लिए i, हम या तो इसे शामिल करना चुनते हैं (एक पुनरावृत्ति के रूप में संभव है), जिस स्थिति में हम आवश्यक उत्पाद Nको विभाजित iऔर क्षय करते हैं M। यदि हम नहीं करते हैं, तो हम i1 से बढ़ाते हैं , लेकिन केवल तभी i<N, जब से अधिक से अधिक उपयोग करने वाले विभाजकों का कोई उपयोग नहीं होता है N

जब न्यूनतम विभाजक iसे अधिक हो जाता है N, तो अधिक संभावित विभाजक नहीं होते हैं। तो, हम जाँच अगर हम अगर देखकर सफल रहा है M==0 and N==1, या, समतुल्य रूप, M+1==N==1या M+1==N<2, जब के बाद से M+1==N, आपसी मूल्य एक सकारात्मक पूर्णांक (इस अनुकूलन के लिए FryAmTheEggman करने के लिए धन्यवाद) होने की गारंटी है।

यह कोड Nअधिकांश प्रणालियों पर लगभग 1000 के लिए एक स्टैक अतिप्रवाह का कारण होगा , लेकिन आप इससे बचने के लिए स्टैकलेस पायथन में इसे चला सकते हैं । इसके अलावा, यह अपने घातीय पुनरावर्ती शाखाओं में बंटने के कारण बेहद धीमा है।


मुझे लगता है कि आप का उपयोग कर सकते हैं-~M==N<2
FryAmTheEggman

@FryAmTheEggman मैंने सोचा था कि झूठी सकारात्मकता देगा, लेकिन वास्तव में यह काम करता है, धन्यवाद संयुक्त बाधाओं पर Mऔर N। धन्यवाद!
xnor

4

रूबी, 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}

वास्तव में एक पुनरावर्ती परिभाषा के लिए यथोचित रूप से कुशल। प्रत्येक भाजक जोड़ी [d,q]के लिए, dछोटा होने के साथ , हम परिणाम का योग करते हैं f[q,m-1]। मुश्किल हिस्सा यह है कि आंतरिक कॉल में, हम कारकों को डी या उससे अधिक तक सीमित करते हैं ताकि हम डबल-काउंटिंग को समाप्त न करें।

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

सीजेएम, 48 बाइट्स

यह बहुत कम हो सकता है, लेकिन मैंने Mऑनलाइन संकलक पर सभ्य संख्या के लिए काम करने के लिए कुछ चेक जोड़े हैं ।

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

इसे यहाँ ऑनलाइन आज़माएँ


यह छोटी गाड़ी है। इनपुट का प्रयास करें 2 1। अपेक्षित आउटपुट: 1. वास्तविक आउटपुट: 0.
पीटर टेलर

@PeterTaylor आहें। फिक्स्ड।
ऑप्टिमाइज़र

2

T-SQL 456 373

मुझे यकीन है कि यह तब टूटेगा जब इनपुट बड़े होने के करीब होंगे।

कई सेट के बजाय CONCAT और चयन के साथ बहुत सारे पात्रों को बचाने में मदद करने के लिए @MickyT का धन्यवाद।

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)

मैं इसे उभारना चाहता हूं, लेकिन मुझे इसका परीक्षण करने का सरल तरीका नहीं मिल रहा है। कोई विचार? तृतीय-पक्ष पुष्टि करता है कि यह काम करता है, अच्छा भी है।
ज्योबिट्स

मुझे रूपांतरण की एक जोड़ी मिलती है जिसे हम इसे चलाते हैं (2012)। वे इन कथनों से प्रतीत होते हैं SET @C+=',# A'+@औरSET @D+='*A'+@+'.A'SET @E+=' AND A'+(@-1)+'.A<=A'+@+'.A'
मिकी

आपको भी ठीक करना होगा SET @C+=@D+'=@N'+@E+' SELECT @'@Nअंदर यह दायरे से बाहर कर रही है उद्धरण जब आप निष्पादित है @C। इसके अलावा मुझे लगता है कि आप डुप्लिकेट गिनती खत्म हो जाएगा
MickyT

अब मैंने 2012 में इसका परीक्षण किया है। यह काम करना चाहिए।
22

2
अब अच्छा काम करता है :) एक जगह है जहाँ आप कुछ पात्रों को शेव कर सकते हैं। CONCATअपने तार बनाने के लिए प्रयोग करके देखें । तब आप CONVERTएस ड्रॉप कर सकते हैं । SELECT @+=1,@C+=CONCAT(...),@D+=CONCAT(...),@E+=CONCAT(...)अपने WHILEपाश में कोशिश करो । आपको एक उचित संख्या
बचानी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.