列表

详情


NC21883. 背单词

描述

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)

示例1

输入:

2
2 2 2
500 20 30

输出:

702
175540856

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 461ms, 内存消耗: 4712K, 提交时间: 2019-01-02 00:18:46

#include <bits/stdc++.h>
using namespace std;

long long d[5005][55],p[5005][55];
const int mod=1e9+7;

int main(){
	int t,n,a,b;
	cin>>t;
	while(t--){
		cin>>n>>a>>b;
		memset(d,0,sizeof(d));
		memset(p,0,sizeof(p));
		d[1][1]=5;
		p[1][1]=21;
		long long ans=0;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=a;j++){
				ans=(ans+d[i][j])%mod;
				d[i+1][j+1]=(d[i+1][j+1]+d[i][j]*5)%mod;
				p[i+1][1]=(p[i+1][1]+d[i][j]*21)%mod;
			}
			for(int j=1;j<=b;j++){
				ans=(ans+p[i][j])%mod;
				p[i+1][j+1]=(p[i+1][j+1]+p[i][j]*21)%mod;
				d[i+1][1]=(d[i+1][1]+p[i][j]*5)%mod;
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 281ms, 内存消耗: 4728K, 提交时间: 2020-04-10 13:36:12

#include<bits/stdc++.h>
using namespace std;

const long long mod=1e9+7;
long long ans,DP[5005][55][2];
int main()
{
    int i,j,T,n,a,b;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d%d",&n,&a,&b);
		memset(DP,0,sizeof(DP)),ans=0;
		DP[0][0][0]=DP[0][0][1]=1;
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=a;j++)DP[i][j][0]=DP[i-1][j-1][0]*5%mod,DP[i][0][1]=(DP[i][0][1]+DP[i][j][0])%mod;
			for(j=1;j<=b;j++)DP[i][j][1]=DP[i-1][j-1][1]*21%mod,DP[i][0][0]=(DP[i][0][0]+DP[i][j][1])%mod;
		}
		for(i=1;i<=n;i++)ans=(ans+DP[i][0][0]+DP[i][0][1])%mod;
		printf("%lld\n",ans);
	}
    return 0;
}

上一题