धनात्मक पूर्णांकों की सरणी nums दी गई है। सभी गैर-खाली सबसीक्वेंस के GCDs में से अद्वितीय मानों की संख्या ज्ञात करें।
मुख्य अंतर्दृष्टि
एक मान x किसी सबसीक्वेंस का GCD हो सकता है यदि और केवल यदि nums में x के गुणज हैं जिनका GCD ठीक x है।
एल्गोरिदम: सीव-जैसा दृष्टिकोण
T = max(nums) + 1numsको सेट में बदलें (O(1) लुकअप)- प्रत्येक
x = 1 से T-1के लिए:xके सभी गुणजyजांचें जोnumsमें हैं- उनका GCD गणना करें
- यदि GCD =
xतोxएक वैध GCD है
Python कार्यान्वयन
from math import gcd
def count_different_subsequence_gcds(nums):
T = max(nums) + 1
num_set = set(nums)
ans = 0
for x in range(1, T):
g = 0
# x के सभी गुणज जांचें
for y in range(x, T, x):
if y in num_set:
g = gcd(g, y)
if g == x: # जल्दी ब्रेक: GCD x तक पहुंच गया
break
if g == x:
ans += 1
return ans
# परीक्षण
nums = [4, 6, 18]
print(count_different_subsequence_gcds(nums)) # 4
व्याख्या (nums = [4, 6, 18])
| x | nums में x के गुणज | उनका GCD | वैध? |
|---|---|---|---|
| 1 | कोई नहीं | 0 | नहीं |
| 2 | 4, 6, 18 | gcd(4,6,18)=2 | हां |
| 3 | 6, 18 | gcd(6,18)=6 | नहीं (6≠3) |
| 4 | 4 | 4 | हां |
| 5 | कोई नहीं | 0 | नहीं |
| 6 | 6, 18 | 6 | हां |
| 18 | 18 | 18 | हां |
वैध GCDs: {2, 4, 6, 18} → उत्तर = 4
जटिलता
- समय: O(T log T) जहां T = max(nums)। हार्मोनिक श्रृंखला: Σ(T/x) = T log T
- स्थान: O(T) सेट के लिए
अनुकूलन
# उपस्थिति सरणी (सेट से तेज़)
present = [False] * T
for x in nums:
present[x] = True
for x in range(1, T):
g = 0
for y in range(x, T, x):
if present[y]:
g = gcd(g, y)
if g == x:
break
if g == x:
ans += 1
मुख्य बिंदु
- प्रत्येक संभावित GCD मान
xके लिए जांचें कि क्या यह प्राप्त करने योग्य है - गुणजों पर पुनरावृति करके कुशलता से जांचें
- जल्दी ब्रेक जब GCD
xतक पहुंच जाए - यह दृष्टिकोण LeetCode "Number of Different Subsequences GCDs" समस्या का मानक समाधान है