#include <stdio.h>
#include <vector>
using namespace std;
typedef unsigned long long int ulong;
typedef unsigned int uint;
inline ulong binomial_pascal(unsigned int n, unsigned int k){
if( k>n ) return 0;
if( k==0 || k==n ) return 1;
uint wynik;
uint osize = 1;
uint col;
vector<uint> vect;
if(k>n/2)
{
k=n-k;
}
vect.resize(1);
vect[0] = 1;
for(uint row=1; row <= n; row++)
{
if (row % 2 == 0) {
vect.resize(vect.size()+1);
col = vect.size()-1;
vect[col] = 2 * vect[col-1];
}
for(col = osize - 1; col >= 1; col--)
vect[col] = vect[col] + vect[col-1];
osize = vect.size();
}
wynik = vect[k];
return wynik;
}
#define max 49
int main(void) {
unsigned int n, k, kk;
ulong b, b1, b2;
for( n=0; n<=max; n++ ){
printf("\n%2d - ", n);
//for( k=1; k<=max-n; k++ ) putchar(' ');
for( k=0; k<=n; k++ ) {
b=binomial_pascal(n,k);
if ((k == 0) || (n == 0)) {
putchar('.');
} else {
b1 = binomial_pascal(n-1,k-1);
b2 = binomial_pascal(n-1,k);
if( b != b1 + b2 ) putchar('+');
else putchar('.');
}
putchar(' ');
}}
printf("\n\n "); for( n=0; n<=max; n++ ) printf("%2d", n%10); puts("");
printf( " "); for( n=0; n<=max; n++ ) if( n%10==0 ) printf("%2d", n/10); else printf(" "); puts("");
puts("+ sposób zawodzi");
return 0;}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx2ZWN0b3I+CiAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHVsb25nOwp0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50OwoKaW5saW5lIHVsb25nIGJpbm9taWFsX3Bhc2NhbCh1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQgaW50IGspewogIGlmKCBrPm4gKSByZXR1cm4gMDsKICBpZiggaz09MCB8fCBrPT1uICkgcmV0dXJuIDE7CgogIHVpbnQgd3luaWs7CiAgdWludCBvc2l6ZSA9IDE7CiAgdWludCBjb2w7CiAKICB2ZWN0b3I8dWludD4gdmVjdDsKIAogIGlmKGs+bi8yKQogIHsKICAgICAgaz1uLWs7CiAgfQogCiAgdmVjdC5yZXNpemUoMSk7CiAgdmVjdFswXSA9IDE7CiAgZm9yKHVpbnQgcm93PTE7IHJvdyA8PSBuOyByb3crKykKICB7CiAgICBpZiAocm93ICUgMiA9PSAwKSB7CiAgICAgIHZlY3QucmVzaXplKHZlY3Quc2l6ZSgpKzEpOwogICAgICBjb2wgPSB2ZWN0LnNpemUoKS0xOwogICAgICB2ZWN0W2NvbF0gPSAyICogdmVjdFtjb2wtMV07CiAgICB9CiAgICBmb3IoY29sID0gb3NpemUgLSAxOyBjb2wgPj0gMTsgY29sLS0pCiAgICAgIHZlY3RbY29sXSA9IHZlY3RbY29sXSArIHZlY3RbY29sLTFdOwogICAgb3NpemUgPSB2ZWN0LnNpemUoKTsKICB9CiAKICB3eW5payA9IHZlY3Rba107CgogIHJldHVybiB3eW5pazsKfQoKI2RlZmluZSBtYXggNDkKCmludCBtYWluKHZvaWQpIHsKCXVuc2lnbmVkIGludCBuLCBrLCBrazsKCXVsb25nIGIsIGIxLCBiMjsKCWZvciggbj0wOyBuPD1tYXg7IG4rKyApewoJCXByaW50ZigiXG4lMmQgLSAiLCBuKTsKCQkvL2Zvciggaz0xOyBrPD1tYXgtbjsgaysrICkgcHV0Y2hhcignICcpOwoJCWZvciggaz0wOyBrPD1uOyBrKysgKSB7CgkJCWI9Ymlub21pYWxfcGFzY2FsKG4sayk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoayA9PSAwKSB8fCAobiA9PSAwKSkgeyAKICAgCQkJICBwdXRjaGFyKCcuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYjEgPSBiaW5vbWlhbF9wYXNjYWwobi0xLGstMSk7ICAKICAgICAgICAgICAgICAgICAgICAgICAgICBiMiA9IGJpbm9taWFsX3Bhc2NhbChuLTEsayk7ICAgCgkJCSAgaWYoIGIgIT0gYjEgKyBiMiApIHB1dGNoYXIoJysnKTsKCQkJICBlbHNlIHB1dGNoYXIoJy4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAJCQlwdXRjaGFyKCcgJyk7Cgp9fSAKCXByaW50ZigiXG5cbiAgICAiKTsgZm9yKCBuPTA7IG48PW1heDsgbisrICkgcHJpbnRmKCIlMmQiLCBuJTEwKTsgcHV0cygiIik7CglwcmludGYoICAiICAgICIpOyBmb3IoIG49MDsgbjw9bWF4OyBuKysgKSBpZiggbiUxMD09MCApIHByaW50ZigiJTJkIiwgbi8xMCk7IGVsc2UgcHJpbnRmKCIgICIpOyBwdXRzKCIiKTsKCXB1dHMoIisgc3Bvc8OzYiB6YXdvZHppIik7CglyZXR1cm4gMDt9