灵感来源:http://www.cnblogs.com/TheRoadToTheGold/p/7476715.html
Description
tot 阶楼梯,每次可以往上跳 1—n 步,往下跳 1——m 步
而且在往下跳的时候只能踩在往上跳时踩过的格子。
现在 xxy 在楼梯上乱跳,想问她跳到楼梯顶上最后又跳回楼梯下面的方案数 mod
233333333。
注意:xxy 只能一直向上跳,跳到楼梯最上面,然后再往下跳,跳回楼梯最底下。
Input
一行 3 个整数 tot,n,m
Output
方案数 % 233333333
Example
Input
2
5 2 4
5 2 3
Output
52
42
Hint
10%的数据,1<=tot,n<=5,m=1
另外 10%的数据,1<=tot,n,m<=5
另外 20%的数据,1<=tot<=10000,1<=n,m<=5
另外 20%的数据,1<=tot<=10000,1<=n,m<=10
另外 20%的数据,1<=tot<=400000,1<=n,m<=5
对于 100%的数据,1<=tot<=400000,1<=n,m<=10
#include<cstdio> #include<cstring> using namespace std; int ans; int pre[21][21]; long long dp[1000001]; const long long mod=233333333; void dfs(int lim,int tot,int now) { if(now>tot) return; if(now==tot) { ans++; return; } for(int i=1;i<=lim;i++) dfs(lim,tot,now+i); } int main() { freopen("stair.in","r",stdin); freopen("stair.out","w",stdout); int tot,n,m; for(int i=1;i<=15;i++) for(int j=1;j<=15;j++) { ans=0; dfs(i,j,0); pre[i][j]=ans; } int T; scanf("%d",&T); while(T--) { memset(dp,0,sizeof(dp)); scanf("%d%d%d",&tot,&n,&m); dp[0]=1; for(int i=1;i<=tot;i++) for(int j=1;j<=m;j++) dp[i]=(dp[i]+dp[i-j]*pre[n][j])%mod; printf("%I64d\n",dp[tot]); } }
时间: 2024-10-11 22:13:15