<?php
class BCN implements Iterator {
private static $table = [];
private $n, $k;
public function __construct ($n) { $this->n=$n; }
public function rewind() { $this->k=0; }
public function current() { return $this->get($this->k); }
public function key() { return $this->k; }
public function next() { ++$this->k; }
public function valid() { return $this->k <= $this->n; }
public function get ($k) {
if ($this->n==0 || $k==0 || $this->n==$k) return 1;
if ($k > $this->n / 2)
$k = $this->n-$k;
if (!isset (self::$table[$this->n][$k])) { $bcn = new BCN ($this->n-1);
self::$table[$this->n][$k] = $bcn->get($k-1)+$bcn->get($k);
}
return self::$table[$this->n][$k];
}
}
function check_binom ($a, $b, $n) {
echo "($a+$b)^$n=", pow($a+$b, $n), '=';
$sum=0;
$x = $a+$b-1;
$xk = 1;
foreach (new BCN($n) as $k=>$bc) {
if ($k) echo '+';
echo $bc,'*',$xk;
$sum += $bc*$xk;
$xk *= $x;
}
echo '=', $sum;
}
$a=4;
$b=5;
$n=6;
check_binom ($a, $b, $n);
PD9waHAKCmNsYXNzIEJDTiBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKICBwcml2YXRlIHN0YXRpYyAkdGFibGUgPSBbXTsKICBwcml2YXRlICRuLCAkazsKCiAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0ICgkbikgeyAkdGhpcy0+bj0kbjsgfQoKICBwdWJsaWMgZnVuY3Rpb24gcmV3aW5kKCkgeyAkdGhpcy0+az0wOyB9CiAgCiAgcHVibGljIGZ1bmN0aW9uIGN1cnJlbnQoKSB7IHJldHVybiAkdGhpcy0+Z2V0KCR0aGlzLT5rKTsgfQogIAogIHB1YmxpYyBmdW5jdGlvbiBrZXkoKSB7IHJldHVybiAkdGhpcy0+azsgfQogIAogIHB1YmxpYyBmdW5jdGlvbiBuZXh0KCkgeyArKyR0aGlzLT5rOyB9CiAgCiAgcHVibGljIGZ1bmN0aW9uIHZhbGlkKCkgeyByZXR1cm4gJHRoaXMtPmsgPD0gJHRoaXMtPm47IH0gIAoKICBwdWJsaWMgZnVuY3Rpb24gZ2V0ICgkaykgewogICAgaWYgKCR0aGlzLT5uPT0wIHx8ICRrPT0wIHx8ICR0aGlzLT5uPT0kaykgcmV0dXJuIDE7CgogICAgaWYgKCRrID4gJHRoaXMtPm4gLyAyKQogICAgICAgJGsgPSAkdGhpcy0+bi0kazsKCiAgICBpZiAoIWlzc2V0IChzZWxmOjokdGFibGVbJHRoaXMtPm5dWyRrXSkpIHsKICAgICAgJGJjbiA9IG5ldyBCQ04gKCR0aGlzLT5uLTEpOwogICAgICBzZWxmOjokdGFibGVbJHRoaXMtPm5dWyRrXSA9ICRiY24tPmdldCgkay0xKSskYmNuLT5nZXQoJGspOwogICAgfQoKICAgIHJldHVybiBzZWxmOjokdGFibGVbJHRoaXMtPm5dWyRrXTsKICB9Cn0KCgpmdW5jdGlvbiBjaGVja19iaW5vbSAoJGEsICRiLCAkbikgewogIAogIGVjaG8gIigkYSskYileJG49IiwgcG93KCRhKyRiLCAkbiksICc9JzsKCiAgJHN1bT0wOwogICR4ID0gJGErJGItMTsKICAkeGsgPSAxOwogIGZvcmVhY2ggKG5ldyBCQ04oJG4pIGFzICRrPT4kYmMpIHsKICAgICBpZiAoJGspIGVjaG8gJysnOwogICAgIGVjaG8gJGJjLCcqJywkeGs7CiAgICAgJHN1bSArPSAkYmMqJHhrOwogICAgICR4ayAqPSAkeDsKICB9CgogIGVjaG8gJz0nLCAkc3VtOwp9CgoKJGE9NDsKJGI9NTsKJG49NjsKY2hlY2tfYmlub20gKCRhLCAkYiwgJG4pOw==