#include <stdio.h>

long silnia(int a)
{
    int i;
    long s = 1;
    if (a > 1)
    {
        for (i = 1; i <= a; i++)
        {
            s *= i;
        }
    }
    return s;
}

long newton(int n, int k)
{
    return silnia(n)/(silnia(k)*silnia(n-k));
}

unsigned long int newton_rek(long int n ,long int k)
{
    if ( n == k || k == 0 )
    {
        return 1;
    }

    if (k > n)
    {
        return 0;
    }

    else return newton_rek(n-1,k-1) + newton_rek(n-1,k);
}

int main(void) {
    const long nmax = 12;
    long n, k;
    unsigned long x;

    printf( "newton_rek:\n");
    for( n = 0; n < nmax; n++ ) {
        for( k = 0; k <= n; k++ ) {
            x = newton_rek(n,k);
            printf( "%u ", x );
        }
        printf( "\n" );
    }
    
    printf( "\nnewton:\n");
    for( n = 0; n < nmax; n++ ) {
        for( k = 0; k <= n; k++ ) {
            x = (unsigned long)newton(n,k);
            printf( "%u ", x );
        }
        printf( "\n" );
    }

return 0;
}