Codeforces #247 (Div.2) C.K-Tree

0

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;
}
view raw k-tree.cpp hosted with ❤ by GitHub