0
点赞
收藏
分享

微信扫一扫

2021 年百度之星·程序设计大赛 - 复赛 1002 Add or Multiply 1(第2类斯特林数)

you的日常 2023-02-09 阅读 78


problem

2021 年百度之星·程序设计大赛 - 复赛 1002 Add or Multiply 1(第2类斯特林数)_c++

solution

  • 想到了是n个小球放到m个盒子里以后,剩下的就是板子了

2021 年百度之星·程序设计大赛 - 复赛 1002 Add or Multiply 1(第2类斯特林数)_c++_02

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 3010;
const int mod = 1e9+7;

LL fac[maxn];
LL init(){ fac[0] = 1; for(int i = 1; i < maxn; i++)fac[i]=fac[i-1]*i%mod; return 0ll;}
LL st[maxn][maxn];
LL init2(){st[0][0]=1; for(int i = 1; i < maxn; i++)for(int j = 1; j <= i; j++)st[i][j]=(st[i-1][j-1]+1ll*j*st[i-1][j]%mod)%mod; return 0ll;}

int main(){
init(); init2();
int T; cin>>T;
while(T--){
int n, m; cin>>n>>m;
LL ans = 0;
for(int i=1; i<=n &&i<=m; i++)ans=(ans+2ll*st[n][i]*st[m][i]%mod*fac[i]%mod*fac[i]%mod)%mod;
for(int i=1; i+1<=n &&i<=m;i++)ans=(ans+1ll*st[n][i+1]%mod*st[m][i]%mod*fac[i+1]%mod*fac[i]%mod)%mod;
for(int i=1; i+1<=m &&i<=n;i++)ans=(ans+1ll*st[m][i+1]%mod*st[n][i]%mod*fac[i+1]%mod*fac[i]%mod)%mod;
cout<<ans<<"\n";
}
return 0;
}


举报

相关推荐

0 条评论