मान लीजिए हमारे पास एक संख्या n है, हमें यह पता लगाना है कि n के किसी उचित भाजक के सम पूर्ण वर्ग होने की प्रायिकता क्या है।
तो, यदि इनपुट n = 36 है, तो आउटपुट 1/8 होगा क्योंकि 36 के आठ उचित भाजक हैं, ये हैं {1,2,3,4,6,9,12,18} और उनमें केवल एक संख्या (4) पूर्ण वर्ग और सम है।
इसे हल करने के लिए, हम निम्नलिखित चरणों का पालन करेंगे:
- यदि n mod 4, 0 के समान नहीं है, तो
- 0 वापस करें
- अन्यथा,
- nc := n, ptr := 2
- l := एक नई सूची
- जब ptr <= nc का वर्गमूल, करें
- a := 0
- जब nc mod ptr, 0 के समान है, करें
- a := a + 1
- nc := floor of (nc / ptr)
- यदि a > 0, तो
- a को सूची l में जोड़ें
- ptr := ptr + 1
- यदि nc > 1, तो सूची l में 1 जोड़ें
- k := l[0]
- d := k + 1
- no := floor of (k / 2)
- l[इंडेक्स 1 से अंत तक] में प्रत्येक i के लिए, करें
- d := d *(i + 1)
- no := no * floor of (i / 2) + 1
- d := d - 1
- यदि n एक पूर्ण वर्ग है, तो
- no := no - 1
- g := d और no का gcd
- d := floor of d / g
- no := floor of no / g
- यदि no, 0 के समान है, तो
- 0 वापस करें
- अन्यथा,
- भिन्न no/d वापस करें
उदाहरण
बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें:
from math import gcd def solve(n): if n % 4 != 0: return 0 else: nc = n ptr = 2 l = [] while ptr <= nc ** 0.5: a = 0 while nc % ptr == 0: a += 1 nc = nc / ptr if a > 0: l += [a] ptr += 1 if nc > 1: l += [1] k = l[0] d = k + 1 no = int(k / 2) for i in l[1:]: d = d * (i + 1) no *= int(i / 2) + 1 d = d - 1 if int(n ** 0.5) ** 2 == n: no -= 1 g = gcd(d, no) d = d // g no = no // g if no == 0: return 0 else: return str(no) + '/' + str(d) n = 36 print(solve(n))
इनपुट
4, 27
आउटपुट
1/8