#include <vector>
#include <iostream>
std::vector<unsigned int> pascal(unsigned int n)
{
// This variable is static, to cache results.
// Not a problem, as long as mathematics do not change between two calls,
// which is unlikely to happen, hopefully.
static std::vector<std::vector<unsigned int> > triangle;
if(triangle.size() <= n)
{
// Compute for i = last to n-1
while(triangle.size() != n)
pascal(triangle.size());
// Compute for n
if(n == 0)
triangle.push_back(std::vector<unsigned int>(1,1));
else
{
std::vector<unsigned int> result(n + 1, 0);
for(unsigned int k = 0; k <= n; k++)
{
unsigned int l = (k > 0 ? triangle[n - 1][k - 1] : 0);
unsigned int r = (k < n ? triangle[n - 1][k] : 0);
result[k] = l + r;
}
triangle.push_back(result);
}
}
// Finish
return triangle[n];
}
std::ostream& operator<<(std::ostream& out, const std::vector<unsigned int>& v)
{
for(unsigned int t = 0; t < v.size(); t++)
out << v[t] << " ";
return out;
}
int main()
{
for(unsigned int t = 0; t < 6; t++)
std::cout << pascal(t) << "\n";
}
CiAgICAjaW5jbHVkZSA8dmVjdG9yPgogICAgI2luY2x1ZGUgPGlvc3RyZWFtPgoKICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4gcGFzY2FsKHVuc2lnbmVkIGludCBuKQogICAgewogICAgICAgIC8vIFRoaXMgdmFyaWFibGUgaXMgc3RhdGljLCB0byBjYWNoZSByZXN1bHRzLgogICAgICAgIC8vIE5vdCBhIHByb2JsZW0sIGFzIGxvbmcgYXMgbWF0aGVtYXRpY3MgZG8gbm90IGNoYW5nZSBiZXR3ZWVuIHR3byBjYWxscywKICAgICAgICAvLyB3aGljaCBpcyB1bmxpa2VseSB0byBoYXBwZW4sIGhvcGVmdWxseS4KICAgICAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8dW5zaWduZWQgaW50PiA+IHRyaWFuZ2xlOwoKICAgICAgICBpZih0cmlhbmdsZS5zaXplKCkgPD0gbikKICAgICAgICB7CiAgICAgICAgICAgIC8vIENvbXB1dGUgZm9yIGkgPSBsYXN0IHRvIG4tMQogICAgICAgICAgICB3aGlsZSh0cmlhbmdsZS5zaXplKCkgIT0gbikKICAgICAgICAgICAgICAgIHBhc2NhbCh0cmlhbmdsZS5zaXplKCkpOwoKICAgICAgICAgICAgLy8gQ29tcHV0ZSBmb3IgbgogICAgICAgICAgICBpZihuID09IDApCiAgICAgICAgICAgICAgICB0cmlhbmdsZS5wdXNoX2JhY2soc3RkOjp2ZWN0b3I8dW5zaWduZWQgaW50PigxLDEpKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBpbnQ+IHJlc3VsdChuICsgMSwgMCk7CiAgICAgICAgICAgICAgICBmb3IodW5zaWduZWQgaW50IGsgPSAwOyBrIDw9IG47IGsrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbCA9IChrID4gMCA/IHRyaWFuZ2xlW24gLSAxXVtrIC0gMV0gOiAwKTsKICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgciA9IChrIDwgbiA/IHRyaWFuZ2xlW24gLSAxXVtrXSA6IDApOwogICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrXSA9IGwgKyByOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdHJpYW5nbGUucHVzaF9iYWNrKHJlc3VsdCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEZpbmlzaAogICAgICAgIHJldHVybiB0cmlhbmdsZVtuXTsKICAgIH0KCiAgICBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGludD4mIHYpCiAgICB7CiAgICAgICAgZm9yKHVuc2lnbmVkIGludCB0ID0gMDsgdCA8IHYuc2l6ZSgpOyB0KyspCiAgICAgICAgICAgIG91dCA8PCB2W3RdIDw8ICIgIjsKICAgICAgICByZXR1cm4gb3V0OwogICAgfQoKICAgIGludCBtYWluKCkKICAgIHsKICAgICAgICBmb3IodW5zaWduZWQgaW50IHQgPSAwOyB0IDwgNjsgdCsrKQogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgcGFzY2FsKHQpIDw8ICJcbiI7CiAgICB9Cgo=