NC21883. 背单词
描述
输入描述
首先输入一个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; }