題目意思:給你n個數,讓你組成從1~n個不重集合的組合數目是多少?
題解思路:
知識點:組合數學中的第二斯特林數,貝爾數
注意,在這道題裡,i要從1開始,接下只要先求s2(0,0)~s2(2000,2000), 之後逐次累加到bell[n]即可
#include#define register int rint
#define inf 0x3f3f3f3f3f
#define mod 1000000007
#define mem(a,b) memset(a,b,sizeof(a))
#define pi 3.141592653589793
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pairpii;
const int n=2020;
const int max=1e4+20;
const double esp=1e-6;
inline int rd()
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}int n,t;
int bell[n],s2[n][n];
int main()
while(t--)
{n=rd();
bell[0]=0;
for(int i=1;i<=n;++i) bell[i]=(bell[i-1]+s2[n][i])%1000;
cout《參考部落格:
備註:一開始提交的時候碰到了記憶體超限,我又重新更改了一下,順便寫一下記憶體的求公式:
假設申請了 int a[x][x],那麼你的記憶體為y(mb) = x*x*4/1024/1024
乙個int 等於 4個位元組,乙個位元組等於乙個byte,1kb=1024byte,1mb=1021kb.......
斯特林數和貝爾數
版權說明 抄寫了hypoc的部落格 符號 beginn m end 或 s n,m 意義 n 個不同球穿成 m 條項鍊的方案數。第 n 個球接在前面 n 1 個小球中某乙個的後面或新開一條項鍊。遞推式 s n,m n 1 s n 1,m s n 1,m 1 複雜度 o nm 考慮生成函式優化。第 i...
組合數學之斯特林數 貝爾數
斯特林數經常和組合數學中的上公升下降問題聯絡到一起。第一類斯特林數 將n個不同的元素構成m個不同的環的方案數目 兩環不想等當且僅當任一不能通過旋轉得到另一環 dp i j 表示i個元素構成j個環 有兩種情況可以得到dp i j 1.前i 1個元素構成了j 1個不同的環,第i個元素單獨成環 共有 dp...
第一 二類斯特林數,貝爾數
s1 n m 表示把n個元素劃分成m個非空迴圈排列集合的方案數 void getstirling s2 n m 表示把n個元素劃分成m個非空集合的方案數 void getsstirling 簡單闡述一下為什麼不用給s2 i i 賦值為1 i 1,j 1時 s2 1 1 1 這是由s2 i 1 1得到...