x या y से विभाज्य संख्याओं का योग (Inclusion-Exclusion सिद्धांत)
उदाहरण (बग्स के साथ)
<?php
function sum_of_nums($n_val, $x_val, $y_val) {
$val_1; $val_2; $val_3;
$val_1 = floor(((int)$n_val / $x_val)) * (2 * $x_val + (int)((int)$n_val / $x_val - 1) * $X) / 2; // बग: $X अपरिभाषित
$val_2 = floor(((int)$n_val / $y_val)) * (2 * $y_val + (int)((int)$n_val / $y_val - 1) * $y_val) / 2;
$val_3 = floor(((int)$n_val / ($x_val * $y_val))) * (2 * ($x_val * $y_val) + ((int)$n_val / ($x_val * $y_val) - 1) * (int)($x_val * $y_val)) / 2;
return ceil($val_1 + ($val_2 - $val_3));
}
$n_val = 11; $x_val = 2; $y_val = 5;
print_r("The sum of first 11 natural numbers divisible by 2 or 5 is ");
echo sum_of_nums($n_val, $x_val, $y_val);
?>
आउटपुट
The sum of first 11 natural numbers divisible by 2 or 5 is 15
समस्याएं
$Xअपरिभाषित वेरिएबल (केस-सेंसिटिविटी)- फॉर्मूला जटिल और त्रुटि-प्रवण है
- LCM गणना गलत हो सकती है (x*y हमेशा LCM नहीं होता)
सही दृष्टिकोण: Inclusion-Exclusion सिद्धांत
योग = (x के गुणजों का योग) + (y के गुणजों का योग) - (LCM(x,y) के गुणजों का योग)
सुधारा गया कोड
<?php
function sumDivisibleBy(int $n, int $k): int {
// 1 से n तक k के गुणजों का योग
// k, 2k, 3k, ..., mk जहां m = floor(n/k)
// योग = k * (1 + 2 + ... + m) = k * m(m+1)/2
$m = (int)($n / $k);
return $k * $m * ($m + 1) / 2;
}
function lcm(int $a, int $b): int {
return abs($a * $b) / gcd($a, $b);
}
function gcd(int $a, int $b): int {
return $b == 0 ? $a : gcd($b, $a % $b);
}
function sumDivisibleByXorY(int $n, int $x, int $y): int {
$sumX = sumDivisibleBy($n, $x);
$sumY = sumDivisibleBy($n, $y);
$sumLCM = sumDivisibleBy($n, lcm($x, $y));
return $sumX + $sumY - $sumLCM;
}
// टेस्ट: n=11, x=2, y=5
// 2 के गुणज: 2,4,6,8,10 → योग=30
// 5 के गुणज: 5,10 → योग=15
// LCM(2,5)=10 के गुणज: 10 → योग=10
// कुल = 30+15-10 = 35
echo "Sum: " . sumDivisibleByXorY(11, 2, 5); // 35 (नहीं 15!)
?>
मूल आउटपुट 15 क्यों?
मूल कोड "पहले 11 नेचुरल नंबर्स जो 2 या 5 से विभाज्य हैं" की व्याख्या अलग तरीके से कर रहा था (शायद पहले 11 ऐसे नंबर)। सही व्याख्या: "1 से 11 तक के नंबर जो 2 या 5 से विभाज्य हैं"।
स्पष्टीकरण
- व्याख्या A: 1 से n तक के नंबर्स में से x या y से विभाज्य → योग = 35
- व्याख्या B: पहले n नंबर्स जो x या y से विभाज्य हैं → अलग गणना