Треугольник Паскаля
Всем известны формулы![\begin{array}{rcc|c|ccccccccccccc} (a+b)^0&=& 1 & 0&&&&&&&1 \\[4pt] (a+b)^1 &=& a+b& 1&&&&&&1&&1 \\[4pt] (a+b)^2 &=& a^2+2ab+b^2 & 2&&&&&1&&2&&1 \\[4pt] (a+b)^3 &=& a^3+3a^2b+3ab^2+b^3 & 3&&&&1&&3&&3&&1 \\[4pt] (a+b)^4 &=& a^4 + 4a^3b + 6a^2b^2 + 4 ab^3+ b^4 & 4&&&1&&4&&6&&4&&1 \\[4pt] (a+b)^5 &=& \ldots & 5&&1&&5&&10&&10&&5&&1 \\[4pt] (a+b)^6 &=& \ldots & 6&1&&6&&15&&20&&15&&6&&1 \end{array}](http://acm.mipt.ru/twiki/pub/Cintro/PascalTriangle/d922c256adc272e2ccfe999292fd7253.png)





Докажите, что
Рассмотрим две программы, которыерешают следующие задачи:

- Запрограммировать функцию
.
- Вывести на экран n строчек треугольника Паскаля.
/* Вычисление биномиальных коэффициентов. */ #include <stdio.h> long C(long n,long k) { if(k == 0 || n == k) return 1; return C(n - 1, k - 1) + C(n - 1, k); } int main() { long n, k; scanf ("%ld%ld", &n, &k); printf ("%ld ", C(n, k)); return 0; }
- Сколько раз вызовется функция C(., .) при вычислении С(n, k)?
- Докажите, что время вычисления
по приведенному алгоритму пропорционально
.
- Оцените ассимптотику
, а именно, напишите программу, которая вычисляет
для n=2, 4, ... , 40 и нарисуте график
от n.
/* Вычисление треугольника Паскаля. */ #include <stdio.h> #define N 1000 long c[N]; int main () { long n, i, j; scanf ("%ld", &n); for(i = 1; i <= n ; i++) c[i] =0; c[0] = 1; for(j = 1 ; j <= n; j++) for(i = j; i >= 1 ; i--) c[i] = c[i-1] + c[i]; for(i = 0; i <= n ; i++) printf ("%ld\n", c[i]); return 0; }
- Докажите, что указанный алгоритм вычисления n -ой строчки треугольника Паскаля


- Начиная с какого n самое большой число из n -ой строчки не умещается в тип
long
?
Рекурсия с запоминанием
Сравните время вычисления C(20,10) с запоминанием и без./* Вычисление биномиальных коэффициентов. */ #include <stdio.h> long Cd[100][100]; long C(long n,long k) { if ( Cd[n][k] > 0 ) return Cd[n][k]; if (k == 0 || n == k) return 1; return Cd[n][k] = C(n - 1, k - 1) + C(n - 1, k); } int main() { long n, k; for(n = 0; n < 100; n++) for( k = 0 ; k < 100; k++) Cd[n][k] = 0; scanf ("%ld%ld", &n, &k); printf ("%ld\n", C(n, k)); return 0; }