LL T[55],B[55]; void get_bell(int n,int mod){ B[0]=1; B[1]=1; T[0]=1; for(int i=2;i<=n;++i){ T[i-1]=B[i-1]; for(int j=i-2;j>=0;--j) T[j]=(T[j]+T[j+1])%mod; B[i]=T[0]; } }
//求B[n]%mod //要先预处理前50项Bell数,当然可以更多 //vis每次调用前都要清空 map<int,LL> vis; LL bell_mod(int n,int mod){ LL ret=vis[n]; if(ret) return ret; if(n<=50) return B[n]; //改 LL k=0; LL P=1; while(P<n){ P=P*mod; ++k; } P/=mod; --k; return vis[n]=(k*bell_mod(n-P,mod)+bell_mod(n-P+1,mod))%mod; }
原文地址:http://blog.csdn.net/whai362/article/details/45308169