Problem link: http://codeforces.com/contest/431/problem/C
Simple recursion with memoization works.
Code is self explanatory
#include <vector> | |
#include <list> | |
#include <map> | |
#include <set> | |
#include <deque> | |
#include <queue> | |
#include <stack> | |
#include <bitset> | |
#include <algorithm> | |
#include <functional> | |
#include <numeric> | |
#include <utility> | |
#include <sstream> | |
#include <iostream> | |
#include <iomanip> | |
#include <cstdio> | |
#include <cmath> | |
#include <cstdlib> | |
#include <ctime> | |
#include <cstring> | |
#include <climits> | |
#include <stdlib.h> | |
#include <stdio.h> | |
using namespace std; | |
#define REP(i,n) for(int i=0; i<n; i++) | |
#define FOR(i,st,end) for(int i=st;i<end;i++) | |
#define db(x) cout << (#x) << " = " << x << endl; | |
#define mp make_pair | |
#define pb push_back | |
#define mod 1000000007 | |
typedef long long int ll; | |
int k,d,n; | |
ll dp[105][2]; | |
ll solve(int x,int f){ | |
if(dp[x][f]!=-1){ | |
return dp[x][f]; | |
} | |
if(x>n) | |
dp[x][f]=0; | |
else if((x==n)&&f) | |
dp[x][f]=1; | |
else{ | |
ll ret=0; | |
for(int i=1;i<=k;i++){ | |
if(x+i<=n){ | |
ret+=solve(x+i,f||(i>=d)?1:0); | |
ret%=mod; | |
} | |
} | |
dp[x][f]=ret; | |
} | |
return dp[x][f]; | |
} | |
int main(){ | |
REP(i,105){ | |
dp[i][0]=-1; | |
dp[i][1]=-1; | |
} | |
scanf("%d%d%d",&n,&k,&d); | |
ll ret=0; | |
for(int i=1;i<=k;i++){ | |
ret+=solve(i,(i>=d)?1:0); | |
ret%=mod; | |
} | |
cout<<ret; | |
} |