天天看點

FZU 2098 刻苦的小芳

Description

小芳是一個努力用功的好孩子。快聯考了,她正在努力備戰中。她要完成n份作業,然後把完成的作業堆成老高的一堆。為了保證學習的效率,她總是在一份作業寫完後還會回過頭去複習一下。是以她總是在寫完幾份作業就從已寫完的作業堆中從上到下拿幾本來複習,要知道如果不這麼做的話把作業弄亂就麻煩了。另外,她還發現,如果她的書疊得太高了就會因為重心不穩而倒下,是以她必須保證她疊的書不能超過k份。在寫完作業休息之餘,她看了那些作業,突然想到了一個問題。她想知道她這麼複習将可能多少種複習的順序。為了解答這個問題,于是她特地來請教學過的你來回答。你能幫她嗎?

Input

輸入有多組case(<=20)。每組case有一行,有兩個數n,k,分别表示作業總數和書可以疊的最大數量。n和k均為小于100的非負數。

Output

答案對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

#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;
}