背单词
链接:https://ac.nowcoder.com/acm/contest/326/B
题目描述
winterzz1准备考4级了,现在winterzz1决定把世界上所有单词都背一遍,winterzz1发现任意一个单词最多有A个连续的元音,最多有B个连续的辅音。且单词最长长度为N,winterzz1问你在满打满算的情况他需要背多少单词???
输入描述:
首先输入一个T(T<=100),表示有T组案例,每组案例依次输入三个正整数N,A,B,N<=5000,A<=50,B<=50;
输出描述:
输出winterzz1最多需要背多少单词,结果mod(10^9+7)
输入
2 2 2 2 500 20 30
输出
702 175540856
备注:
元音字母为a,e,i,o,u,其余21个字母均为辅音
开三维数组,第一维为当前处理到第几个位置,第二维为重复的是元音还是辅音,第三维为重复的次数
1 #include<bits/stdc++.h> 2 using namespace std; 3 const long long MOD=1e9+7; 4 5 int T; 6 long long dp[5005][2][55]; 7 8 int main(){ 9 std::ios::sync_with_stdio(false); 10 cin>>T; 11 while(T--){ 12 memset(dp,0,sizeof(dp)); 13 dp[1][0][1]=5,dp[1][1][1]=21; 14 int n,a,b; 15 cin>>n>>a>>b; 16 long long ans=0; 17 for(int i=2;i<=n;i++){ 18 for(int j=2;j<=a;j++){ 19 dp[i][0][j]=(dp[i-1][0][j-1]*5)%MOD; 20 } 21 for(int j=1;j<=a;j++){ 22 dp[i][1][1]=(dp[i][1][1]+dp[i-1][0][j]*21)%MOD; 23 } 24 for(int j=2;j<=b;j++){ 25 dp[i][1][j]=(dp[i-1][1][j-1]*21)%MOD; 26 } 27 for(int j=1;j<=b;j++){ 28 dp[i][0][1]=(dp[i][0][1]+dp[i-1][1][j]*5)%MOD; 29 } 30 } 31 for(int i=1;i<=n;i++){ 32 for(int j=1;j<=a;j++){ 33 ans=(ans+dp[i][0][j])%MOD; 34 } 35 for(int j=1;j<=b;j++){ 36 ans=(ans+dp[i][1][j])%MOD; 37 } 38 } 39 cout<<ans<<endl; 40 } 41 42 }