G46 第二类斯特林数 斯特林子集数

视频链接:https://www.bilibili.com/video/BV1Bx4y1u72h/

 Luogu P3904 三只小猪

#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;
}

 

posted @ 2023-01-04 16:23  董晓  阅读(156)  评论(0编辑  收藏  举报