Всё время думаем, что нас никто не ценит.
Сколько человека в человеке не корми, он всё равно волком смотрит.
Дадено несметное число може да се представи като обединение на непресичащи се, непразни негови подмножества. За множеството А={1, 2, 3} те ще бъдат:
{1,2,3}
 {1,2},{3}
 {1,3},{2}
 {1},{2,3}
 {1},{2},{3}
 -Числа на Бел и Стирлинг
Броят на разбиванията за множество с “n” елемента е равен на n-тото число на Бел B(n). Числата на Бел се дефинират по следния начин:
 B(n)=?St(n,k) за к от 0 до n включително.
St(n,k) са числата на Стирлинг от втори род, които се дефинират рекурсивно така:
Числата на Стирлинг представят броя на представянията на n-елементно пропасть като обединение на исправно “к” непресичащи се негови непразни подмножества. Тях можем да намерим по няколко начина. Единият е да използваме директно рекурентната принцип и да реализираме съответна рекурсивна функция. Това обаче допуска неколкократно изчисляване на някои стойности, което води до неефективно вердикт. Числата на Стирлинг и Бел ще намерим итерационно по следния начало: Първо ще намерими и запазим числата на Стирлинг M[i]=St(n,i), за i=0,1,….,n. След това n-тото состав на Бел ще намерим като торба на съответните числа на Стирлинг.
 
Числата на Стирлинг определят триъгълник, подобен на този на Паскал - триъгълник на Стирлинг.
 
#include <iostream>
using namespace std;
#define MAXN 100
unsigned long m[MAXN+1],n;
void stirling(unsigned n)
 {
 if(n==0) m[0]=1;
 else m[0]=0;
 for(int i=1;i<
 =n;i++){
 m[i]=1;
 for(int j=i-1;j>
 =1;j--) m[j]=j*m[j]+m[j-1];}
 }
 
unsigned long bell(int n)
 {
 unsigned long result=0;
 for(int i=0;i<
 =n;i++) result+=m[i];return result;
 }
 
int main()
 {
 cin >> n; 
 stirling(n);
 cout << bell(n) << 
 " ";system(
 "pause");return 0;
 }
 Сорсът можете да дръпнете от тук.
 Серик
Flash game again: toytown tower defense
Время, потраченное на повышение квалификации, входит в трудовой стаж!
Контакты
Комментариев нет:
Отправить комментарий