FZU2098 刻苦的小芳

来源:互联网 发布:挽歌seo 编辑:程序博客网 时间:2024/04/27 10:14

Description

小芳是一个努力用功的好孩子。快高考了,她正在努力备战中。她要完成n份作业,然后把完成的作业堆成老高的一堆。为了保证学习的效率,她总是在一份作业写完后还会回过头去复习一下。因此她总是在写完几份作业就从已写完的作业堆中从上到下拿几本来复习,要知道如果不这么做的话把作业弄乱就麻烦了。另外,她还发现,如果她的书叠得太高了就会因为重心不稳而倒下,所以她必须保证她叠的书不能超过k份。在写完作业休息之余,她看了那些作业,突然想到了一个问题。她想知道她这么复习将可能多少种复习的顺序。为了解答这个问题,于是她特地来请教学过的你来回答。你能帮她吗?

Input

输入有多组case(<=20)。每组case有一行,有两个数n,k,分别表示作业总数和书可以叠的最大数量。n和k均为小于100的非负数。

Output

对于每个询问,输出Case 例子序号: 顺序的种类数。具体详见例子。 答案对10^9+7取模。

Sample Input

5 2
5 5
5 8
6 2
0 1
3 0

Sample Output

Case 1: 16
Case 2: 42
Case 3: 42
Case 4: 32
Case 5: 1
Case 6: 0

Hint

如果没法堆当然输出0
题意简单来说就是给一个最大为k的栈,问n个数字的出栈序列有多少种。
#include<cmath>#include<vector>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const int mod=1e9+7;const int maxn=1e2+10;int n,m,f[maxn][maxn],T,t=0;int main(){//scanf("%d",&T);while (~scanf("%d%d",&n,&m)){memset(f,0,sizeof(f));f[0][0]=1;for (int i=1;i<=n;i++){LL sum=0;for (int j=m;j>=0;j--) {(sum+=f[i-1][j])%=mod;f[i][j+1]=sum;}}LL ans=0;for (int i=0;i<=m;i++) (ans+=f[n][i])%=mod;printf("Case %d: %lld\n",++t,ans);}return 0;}

0 0