#include <stdio.h>
#include <vector>
using namespace std;
typedef unsigned long long int ulong;
typedef unsigned int uint;
inline ulong binomial_pascal(vector<uint> &vect, unsigned int n, unsigned int k){
if( k>n ) return 0;
if( k==0 || k==n ) return 1;
uint osize = 1;
uint col;
vect.resize(n+1);
if(k>n/2)
{
k=n-k;
}
vect[0] = 1;
for(uint row=1; row <= n; row++)
{
if (row % 2 == 0) {
vect[osize] = vect[osize - 1] * 2;
for(col = osize - 1; col >= 1; col--)
vect[col] = vect[col] + vect[col-1];
osize++;
} else {
for(col = osize - 1; col >= 1; col--)
vect[col] = vect[col] + vect[col-1];
}
}
return vect[k];
}
#define max 49
int main(void) {
unsigned int n, k, kk;
ulong b, b1, b2;
vector<uint> v1;
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(v1,n,k);
if ((k == 0) || (n == 0)) {
putchar('.');
} else {
b1 = binomial_pascal(v1,n-1,k-1);
b2 = binomial_pascal(v1,n-1,k);
if( (b != b1 + b2) || (b < b1) || (b < 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+CiAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHVsb25nOwp0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50OwoKaW5saW5lIHVsb25nIGJpbm9taWFsX3Bhc2NhbCh2ZWN0b3I8dWludD4gJnZlY3QsIHVuc2lnbmVkIGludCBuLCB1bnNpZ25lZCBpbnQgayl7CiAgaWYoIGs+biApIHJldHVybiAwOwogIGlmKCBrPT0wIHx8IGs9PW4gKSByZXR1cm4gMTsKCiAgdWludCBvc2l6ZSA9IDE7CiAgdWludCBjb2w7CiAKICB2ZWN0LnJlc2l6ZShuKzEpOwogCiAgaWYoaz5uLzIpCiAgewogICAgICBrPW4tazsKICB9CiAKICB2ZWN0WzBdID0gMTsKCiAgZm9yKHVpbnQgcm93PTE7IHJvdyA8PSBuOyByb3crKykKICB7CiAgICBpZiAocm93ICUgMiA9PSAwKSB7CiAgICAgICAgdmVjdFtvc2l6ZV0gPSB2ZWN0W29zaXplIC0gMV0gKiAyOwoKICAgICAgICBmb3IoY29sID0gb3NpemUgLSAxOyBjb2wgPj0gMTsgY29sLS0pCiAgICAgICAgICB2ZWN0W2NvbF0gPSB2ZWN0W2NvbF0gKyB2ZWN0W2NvbC0xXTsKCiAgICAgICAgb3NpemUrKzsKICAgIH0gZWxzZSB7CiAgICAgICAgZm9yKGNvbCA9IG9zaXplIC0gMTsgY29sID49IDE7IGNvbC0tKQogICAgICAgICAgdmVjdFtjb2xdID0gdmVjdFtjb2xdICsgdmVjdFtjb2wtMV07CiAgICB9CiAgfQogCiAgcmV0dXJuIHZlY3Rba107Cn0KCiNkZWZpbmUgbWF4IDQ5CgppbnQgbWFpbih2b2lkKSB7Cgl1bnNpZ25lZCBpbnQgbiwgaywga2s7Cgl1bG9uZyBiLCBiMSwgYjI7CiAgICAgICAgdmVjdG9yPHVpbnQ+IHYxOwoKCWZvciggbj0wOyBuPD1tYXg7IG4rKyApewoJCXByaW50ZigiXG4lMmQgLSAiLCBuKTsKCQkvL2Zvciggaz0xOyBrPD1tYXgtbjsgaysrICkgcHV0Y2hhcignICcpOwoJCWZvciggaz0wOyBrPD1uOyBrKysgKSB7CgkJCWI9Ymlub21pYWxfcGFzY2FsKHYxLG4sayk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoayA9PSAwKSB8fCAobiA9PSAwKSkgeyAKICAgCQkJICBwdXRjaGFyKCcuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYjEgPSBiaW5vbWlhbF9wYXNjYWwodjEsbi0xLGstMSk7ICAKICAgICAgICAgICAgICAgICAgICAgICAgICBiMiA9IGJpbm9taWFsX3Bhc2NhbCh2MSxuLTEsayk7ICAgCgkJCSAgaWYoIChiICE9IGIxICsgYjIpIHx8IChiIDwgYjEpIHx8IChiIDwgYjIpICkgcHV0Y2hhcignKycpOwoJCQkgIGVsc2UgcHV0Y2hhcignLicpOwogICAgICAgICAgICAgICAgICAgICAgICB9IAogIAkJCXB1dGNoYXIoJyAnKTsKCn19IAoJcHJpbnRmKCJcblxuICAgICIpOyBmb3IoIG49MDsgbjw9bWF4OyBuKysgKSBwcmludGYoIiUyZCIsIG4lMTApOyBwdXRzKCIiKTsKCXByaW50ZiggICIgICAgIik7IGZvciggbj0wOyBuPD1tYXg7IG4rKyApIGlmKCBuJTEwPT0wICkgcHJpbnRmKCIlMmQiLCBuLzEwKTsgZWxzZSBwcmludGYoIiAgIik7IHB1dHMoIiIpOwoJcHV0cygiKyBzcG9zw7NiIHphd29kemkiKTsKCXJldHVybiAwO30=