G46 第二类斯特林数 斯特林子集数
视频链接:https://www.bilibili.com/video/BV1Bx4y1u72h/
#include<iostream> #include<cmath> using namespace std; const int N = 55; int S[N][N][100],L[N][N]; void add(int x, int y){ L[x][y]=max(L[x-1][y-1],L[x-1][y]); for(int i=0; i<L[x][y]; i++){ S[x][y][i]+=S[x-1][y-1][i]+y*S[x-1][y][i]; S[x][y][i+1]+=S[x][y][i]/10; S[x][y][i]%=10; } while(S[x][y][L[x][y]]){ S[x][y][L[x][y]+1]+=S[x][y][L[x][y]]/10; S[x][y][L[x][y]]%=10; L[x][y]++; } } int main(){ int n, m; cin>>n>>m; S[0][0][0]=1; L[0][0]=1; for(int i=1; i<=n; i++) for(int j=1; j<=i; j++) add(i,j); if(!L[n][m]) cout<<0; for(int i=L[n][m]-1; i>=0; i--) cout<<S[n][m][i]; }
#include<iostream> #include<cmath> using namespace std; const int N=55; string S[N][N]; string add(string a,string b){ string res; int l=a.size(),lb=b.size(); int u[N*10]={0},v[N*10]={0}; for(int i=0;i<l;i++)u[l-i-1]=a[i]-'0'; for(int i=0;i<lb;i++)v[lb-i-1]=b[i]-'0'; l=max(l,lb); for(int i=0;i<l;i++) u[i]+=v[i], u[i+1]+=u[i]/10, u[i]%=10; while(u[l])l++; for(int i=l-1;i>=0;i--)res+=u[i]+'0'; return res; } string mul(string a,int b){ string res; int l=a.size(); int u[N*10]={0}, v=0; for(int i=l-1;i>=0;i--)u[l-i-1]=a[i]-'0'; for(int i=0;i<l;i++) u[i]=u[i]*b+v, v=u[i]/10, u[i]%=10; while(v)u[l++]=v%10,v/=10; for(int i=l-1;i>=0;i--)res+=u[i]+'0'; return res; } int main(){ int n,m; cin>>n>>m; for(int i=0;i<N;i++) for(int j=0;j<N;j++) S[i][j]="0"; S[0][0]="1"; for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) S[i][j]=add(S[i-1][j-1],mul(S[i-1][j],j)); cout<<S[n][m]<<endl; }