एक-शून्य लाभांश


28

चुनौती का वर्णन

प्रत्येक सकारात्मक पूर्णांक के लिए nएक संख्या मौजूद होती है, जिसका रूप 111...10...000विभाज्य होता है nअर्थात एक दशमलव संख्या जो सभी के साथ शुरू होती है और सभी 1के साथ समाप्त होती है 0। यह साबित करना बहुत आसान है: यदि हम (सभी के) n+1के रूप में विभिन्न संख्याओं का एक सेट लेते हैं , तो उनमें से कम से कम दो को (कबूतर सिद्धांत के अनुसार) विभाजन के बाद शेष बचेगा। इन दो संख्याओं के अंतर से विभाज्य होगा और उनका वांछित रूप होगा। आपका उद्देश्य एक प्रोग्राम लिखना है जो इस नंबर को पाता है।111...1111nn

इनपुट विवरण

एक सकारात्मक पूर्णांक।

आउटपुट विवरण

एक नंबर pके रूप में 111...10...000, जैसे कि p ≡ 0 (mod n)। यदि आप एक से अधिक पाते हैं - उनमें से कोई भी प्रदर्शित करें (सबसे छोटा होने की आवश्यकता नहीं है)।

टिप्पणियाँ

आपके कार्यक्रम को उचित समय में जवाब देना होगा। जिसका अर्थ है कि ब्रूट-फोर्सिंग की अनुमति नहीं है:

p = 0
while (p != 11..10.00 and p % n != 0)
    p++

न तो यह है:

do
    p = random_int()
while (p != 11..10.00 and p % n != 0)

के रूप में संख्याओं के माध्यम से परिवर्तन 11..10..00की अनुमति है।

आपके कार्यक्रम को मनमाने ढंग से बड़े इनपुट को संभालने की आवश्यकता नहीं है - ऊपरी बाउंड वही है जो आपकी भाषा की ऊपरी सीमा है।

नमूना आउटपुट

2: 10
3: 1110
12: 11100
49: 1111111111111111111111111111111111111111110
102: 1111111111111111111111111111111111111111111111110

क्या हमारे पास संभावित आउटपुट के लिए एक उचित ऊपरी सीमा हो सकती है? (2.4 बिलियन से कम के बारे में कुछ (लगभग एक हस्ताक्षरित पूर्णांक का अधिकतम मूल्य) ठीक होना चाहिए, क्योंकि कुछ कार्यान्वयन के लिए सरणियों या सूचियों की आवश्यकता हो सकती है)
तमोग्ना चौधरी

@ मार्टिनबटनर मुझे लगता है कि पहला संतोषजनक आउटपुट पर्याप्त होना चाहिए (उचित समय सीमा बाधा)
तमोग्ना चौधरी

49 परीक्षण के मामले में अंतिम 0 आवश्यक नहीं है।
कैलक्यूलेटर

@CatsAreFluffy मुझे लगता है कि सभी नंबरों को कम से कम 1और कम से कम एक होना चाहिए 0, अन्यथा 0किसी भी इनपुट के लिए एक समाधान है। (हालांकि इसे स्पष्ट करना अच्छा होगा।)
मार्टिन एंडर

बस आवश्यकता है 1तो काम करने की।
कैलक्यूलेटरफिलीन

जवाबों:


22

गणितज्ञ, 29 बाइट्स

⌊10^(9EulerPhi@#)/9⌋10^#&

मार्टिन बंटनर द्वारा कोड ।

इनपुट पर n, इस के साथ नंबर आउटपुट 9*ϕ(n)के बाद लोगों को nशून्य है, जहां ϕहै यूलर totient समारोह । एक समारोह के साथ phi, इसे पायथन में व्यक्त किया जा सकता है

lambda n:'1'*9*phi(n)+'0'*n

यह n!इसके बजाय भाज्य का उपयोग करने के लिए पर्याप्त होगा ϕ(n), लेकिन मुद्रण कि कई लोगों के पास एक उचित रन-टाइम नहीं है।

दावा करें: शून्य के 9*ϕ(n)बाद वाले nएक से अधिक हैं n

सबूत: सबसे पहले, चलो मामला उस के लिए यह साबित nकी एक बहु नहीं है 2, 3या 5। हम ϕ(n)उनमें से एक के साथ संख्या दिखा देंगे `n की एक बहु है।

kलोगों की बनाई संख्या बराबर होती है (10^k-1)/9। चूँकि nयह एक से अधिक का गुणक नहीं है 3, इसलिए यह तब तक का एक गुणक है nजब तक कि 10^k-1इसका एक कारक nया समकक्ष है 10^k = 1 (mod n)। ध्यान दें कि यह सूत्रीकरण स्पष्ट kकरता है कि यदि लोगों की संख्या के लिए काम करता है, तो ऐसा कोई भी करता है k

तो, हम के लिए देख रहे kके गुणक में होना करने के लिए आदेश की kमें गुणक समूह सापेक्ष एनलैग्रेंज के प्रमेय द्वारा , ऐसा कोई भी आदेश समूह के आकार का एक भाजक है। चूँकि समूह के तत्व उस संख्या से 1हैं nजो अपेक्षाकृत प्रमुख हैं n, इसका आकार यूलर टोटिएंट फ़ंक्शन है ϕ(n) । इसलिए, हमने यह दिखाया है 10^ϕ(n) = 1 (mod n), और इसलिए जो संख्या बनी है, ϕ(n)वह `n 'की एक बहु है।

अब, चलो के संभावित कारकों संभालने दें 3में n। हम जानते हैं कि 10^ϕ(n)-1एक से अधिक है n, लेकिन (10^ϕ(n)-1)/9नहीं हो सकता है। लेकिन, (10^(9*ϕ(n))-1)/9यह एक से अधिक है 9क्योंकि इसमें कई शामिल 9*ϕ(n)हैं, इसलिए इसके अंकों का योग एक से अधिक है 9। और हमने नोट किया है कि प्रतिपादक kको एक स्थिर से गुणा करना विभाज्यता को बनाए रखता है।

अब, यदि 's' और 's ' के nकारक हैं , तो हमें आउटपुट के अंत में शून्य जोड़ने की जरूरत है। यह शून्य से अधिक उपयोग करने के तरीके से अधिक है (वास्तव में ऐसा करेगा)। इसलिए, यदि हमारे इनपुट के रूप में विभाजित किया गया है , तो यह एक बहु होने का गुणन करता है , एक से अधिक होने के लिए गुणा । और, चूंकि एक से अधिक है , यह लोगों का उपयोग करने के लिए पर्याप्त है। तो, यह शून्य के बाद वाले लोगों के लिए काम करता है ।25nlog_2(n)nn = 2^a * 5^b * m9*ϕ(m)n10^n2^a * 5^bnm9*ϕ(n)9*ϕ(n)n


12
बस यह सुनिश्चित करने के लिए कि कोई भी मेरी अनुमति के बिना यह पोस्ट नहीं किया गया है: xnor विधि और सबूत के साथ अपने दम पर आया था, और मैंने सिर्फ उसे एक गणितज्ञ कार्यान्वयन के साथ आपूर्ति की, क्योंकि इसमें एक अंतर्निहित EulerPhiफ़ंक्शन है। वास्तविक कार्यान्वयन के लिए कुछ भी बुरा नहीं है, इसलिए मैं इसे पूरी तरह से अपना काम मानूंगा।
मार्टिन एंडर

9

पायथन 2, 44 बाइट्स

f=lambda n,j=1:j/9*j*(j/9*j%n<1)or f(n,j*10)

जब j१० जैसी १००० की शक्ति होती है, तो फ़्लोर-डिवीज़न j/9१ के १११ की तरह एक नंबर देता है। इसलिए, j/9*j१ को ०१११ के समान ०१ के बराबर संख्या देता है।

फ़ंक्शन इस फॉर्म की संख्याओं का पुनरावर्ती परीक्षण करता है, 10 की उच्च और उच्च शक्तियों की कोशिश कर रहा है जब तक कि हम एक को वांछित संख्या के एक से अधिक नहीं पाते।


1
ओह, अच्छी बात है, हमें केवल 1 ^ n0 ^ n की जांच करने की आवश्यकता है ...
मार्टिन एंडर

@ मार्टिनबटनर यदि यह किसी भी आसान है, तो यह इनपुट मूल्य होने के लिए 0 की संख्या को ठीक करने के लिए भी पर्याप्त है। नहीं पता है कि यह इतने सारे शून्य को मुद्रित करने के लिए कुशल के रूप में गिना जाता है।
xnor

1 ^ n0 ^ n काम की जाँच क्यों करता है?
लिन

5
@ और अधिक शून्य जोड़ना दुख नहीं दे सकता है, और इसमें असीम रूप से कई संभावित संख्याएं हैं, कुछ संख्या में दोनों और शून्य के लिए पर्याप्त होगा।
xnor

5

अजगर, 11 बाइट्स

.W%HQsjZ`TT

परीक्षण सूट

मूल रूप से, यह सिर्फ 1 के सामने और एक 0 को बार-बार डालता है जब तक कि इनपुट द्वारा संख्या विभाज्य नहीं हो जाती।

स्पष्टीकरण:

.W%HQsjZ`TT
                Implicit: Q = eval(input()), T = 10
.W              while loop:
  %HQ           while the current value mod Q is not zero
      jZ`T      Join the string "10" with the current value as the separator.
     s          Convert that to an integer.
          T     Starting value 10.

4

हास्केल, 51 बाइट्स

\k->[b|a<-[1..],b<-[div(10^a)9*10^a],b`mod`k<1]!!0

Xnor के दृष्टिकोण का उपयोग करना। निमि ने एक बाइट को बचाया!


3

CJam, 28 25 19 बाइट्स

Xnor के अवलोकन के साथ 6 बाइट्स सहेजे गए हैं जिन्हें हमें केवल फॉर्म की संख्याओं को देखना होगा ।1n0n

ri:X,:)Asfe*{iX%!}=

इसका परीक्षण यहां करें।

व्याख्या

ri:X    e# Read input, convert to integer, store in X.
,:)     e# Get range [1 ... X].
As      e# Push "10". 
fe*     e# For each N in the range, repeat the characters in "10" that many times,
        e# so we get ["10" "1100" "111000" ...].
{iX%!}= e# Select the first element from the list which is divided by X.

2

गणितज्ञ, 140 55 बाइट्स

NestWhile["1"<>#<>"0"&,"1",FromDigits@#~Mod~x>0&/.x->#]

कई बाइट्स ने xnor के 1 ^ n0 ^ n चाल के लिए धन्यवाद हटा दिया।

न्यूनतम मूल्य, 140 156 बाइट यह सबसे छोटा संभव समाधान देता है।

NestWhile["1"<>#&,ToString[10^(Length@NestWhileList[If[EvenQ@#,If[10~Mod~#>0,#/2,#/10],#/5]&,#,Divisors@#~ContainsAny~{2, 5}&],FromDigits@#~Mod~m>0&/.m->#]&

यह गणना करता है कि कितने शून्य की आवश्यकता है, तब 1तक सभी संभव गणनाओं की जांच करता है जब तक कि यह काम नहीं करता। यह नंबर 0 के साथ एक नंबर को आउटपुट कर सकता है लेकिन <>"0"फाइनल से ठीक पहले जोड़कर इसे ठीक किया जा सकता है &


2

हास्केल, 37 बाइट्स

f n=[d|d<-"10",i<-[1..n*9],gcd n i<2]

यह इस तथ्य का उपयोग करता है कि यह 9*phi(n)लोगों के पास काम करता है, जहां phiयूलर टोटिएंट फ़ंक्शन है। यहाँ, इसका उपयोग gcdऔर फ़िल्टरिंग लागू किया गया है , प्रत्येक मान के लिए एक अंक का उत्पादन जो iकि सीमा में है 1और इसके लिए अपेक्षाकृत प्रमुख है 9*n। यह कई शून्य का उपयोग करने के लिए भी पर्याप्त है।


2

जावास्क्रिप्ट (ईएस 6), 65 बाइट्स

2 बाइट संपादित करें thx @Neil को बचाया

यह 17 अंकीय अंकों के साथ, जावास्क्रिप्ट संख्यात्मक प्रकार की सीमा के भीतर काम करता है। (इतना सीमित)

a=>{for(n='';!(m=n+=1)[17];)for(;!(m+=0)[17];)if(!(m%a))return+m}  

कम गोल्फ वाला

function (a) {
    for (n = ''; !(m = n += '1')[17]; )
        for (; !(m += '0')[17]; )
            if (!(m % a))
                 return +m;
}

1
क्यों नहीं for(m=n;?
नील

@ नील क्योंकि मुझे कम से कम एक शून्य चाहिए। शायद मुझे एक छोटा रास्ता मिल सकता है ... (संपादन के लिए thx)
edc65

ओह, यह सवाल में स्पष्ट नहीं था, लेकिन मैं अब देखता हूं कि नमूना आउटपुट सभी में कम से कम एक शून्य है। उस मामले में आप अभी भी एक बाइट का उपयोग करके बचा सकते हैं for(m=n;!m[16];)if(!((m+=0)%a))
नील

1
@ नील या 2 बाइट्स। Thx
edc65

1

पर्ल 5, 26 बाइट्स

के लिए एक बाइट शामिल है -n( -M5.01स्वतंत्र है)

($.="1$.0")%$_?redo:say$.


0

बीसी, ५ b बाइट्स

define f(n){for(x=1;m=10^x/9*10^x;++x)if(m%n==0)return m;}

नमूना परिणाम

200: 111000
201: 111111111111111111111111111111111000000000000000000000000000000000
202: 11110000
203: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000
204: 111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000
205: 1111100000
206: 11111111111111111111111111111111110000000000000000000000000000000000
207: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
208: 111111000000
209: 111111111111111111000000000000000000
210: 111111000000
211: 111111111111111111111111111111000000000000000000000000000000
212: 11111111111110000000000000
213: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
214: 1111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000
215: 111111111111111111111000000000000000000000
216: 111111111111111111111111111000000000000000000000000000
217: 111111111111111111111111111111000000000000000000000000000000
218: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
219: 111111111111111111111111000000000000000000000000

0

डीसी, 27 बाइट्स

Odsm[O*lmdO*sm+O*dln%0<f]sf

यह एक फ़ंक्शन को परिभाषित करता है fजो चर में अपने तर्क की अपेक्षा करता है n। इसे एक कार्यक्रम के रूप में उपयोग करने के लिए, ?sn lfx pस्टड से पढ़ने के लिए, फ़ंक्शन को कॉल करें, और परिणाम को प्रिंट करने के लिए प्रिंट करें। वैरिएबल mऔर टॉप ऑफ स्टैक को फिर से उपयोग किए जाने Odsmसे पहले (दोहराकर ) 10 पर रीसेट करना होगा f

परिणाम:

200: 111000
201: 111111111111111111111111111111111000000000000000000000000000000000
202: 11110000
203: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000
204: 111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000
205: 1111100000
206: 11111111111111111111111111111111110000000000000000000000000000000000
207: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
208: 111111000000
209: 111111111111111111000000000000000000
210: 111111000000
211: 111111111111111111111111111111000000000000000000000000000000
212: 11111111111110000000000000
213: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
214: 1111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000
215: 111111111111111111111000000000000000000000
216: 111111111111111111111111111000000000000000000000000000
217: 111111111111111111111111111111000000000000000000000000000000
218: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
219: 111111111111111111111111000000000000000000000000
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.