先算第i个单词的开头,也就是不同类型的i-1个单词的和*开头的类型个数,
然后后面每个都是(i-1,j-1)×开头的类型个数,加起来
能开longlong就别省空间了…
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
int main(){
long long dp[5005][2][54];
int t,a,b,n;
cin>>t;
while(t--){
cin>>n>>a>>b;
memset(dp,0,sizeof dp);
dp[1][0][1]=5;
dp[1][1][1]=21;
int i,j,k;
for(i=2;i<=n;i++){
for(j=1;j<=b;j++){
dp[i][0][1]=dp[i][0][1]+(dp[i-1][1][j]*5)%mod;
dp[i][0][1]%=mod;
}
for(j=1;j<=a;j++){
dp[i][1][1]=dp[i][1][1]+dp[i-1][0][j]*21%mod;
dp[i][1][1]%=mod;
}
for(j=2;j<=a;j++){
dp[i][0][j]+=dp[i-1][0][j-1]*5%mod;
dp[i][0][j]%=mod;
}
for(j=2;j<=b;j++){
dp[i][1][j]+=dp[i-1][1][j-1]*21%mod;
dp[i][1][j]%=mod;
}
}long long ans=0;
for(i=1;i<=n;i++){
for(j=1;j<=a;j++){
ans+=dp[i][0][j];
ans%=mod;
}
}
for(i=1;i<=n;i++){
for(j=1;j<=b;j++){
ans+=dp[i][1][j];
ans%=mod;
}
}cout<<ans<<endl;
}
}