Snuke has a string x of length N. Initially, every character in x is `0`.

Snuke can do the following two operations any number of times in any order:

* Choose A consecutive characters in x and replace each of them with `0`.
* Choose B consecutive characters in x and replace each of them with `1`.



Find the number of different strings that x can be after Snuke finishes doing operations. This count can be enormous, so compute it modulo (10^9+7).

Constraints

* 1 \leq N \leq 5000
* 1 \leq A,B \leq N
* All values in input are integers.

Input

Input is given from Standard Input in the following format:


N A B


Output

Print the number of different strings that x can be after Snuke finishes doing operations, modulo (10^9+7).

Examples

Input

4 2 3


Output

11


Input

10 7 2


Output

533


Input

1000 100 10


Output

828178524
/* by Natsu Kinmoe */
#include <bits/stdc++.h>
using namespace std;

#define loop(i,n) for(int i=0;i<(n);i++)
#define pool(i,n) for(int i=(n)-1;i>=0;i--)
#define cont(i,n) for(int i=1;i<=(n);i++)
#define tnoc(i,n) for(int i=(n);i>=1;i--)
#define circ(i,a,b) for(int i=(a);i<=(b);i++)
#define cric(i,a,b) for(int i=(b);i>=(a);i--)
#define sub(i,a) for(int i=a;i;i=((i-1)&(a)))
#define subs(i,a) for(int i=a;i>=0;i=(!i?-1:((i-1)&(a))))
#define subt(i,a) for(int i=((a-1)&a);i;i=((i-1)&(a)))
#define subst(i,a) for(int i=((a-1)&a);i>=0;i=(!i?-1:((i-1)&(a))))
#define range(i,a,b,c) for(int i=(a);((c)>0?i<=(b):i>=(b));i+=(c))
#define foreach(it,v) for(__typeof((v).begin()) it=(v).begin(),_e_D_=(v).end();it!=_e_D_;it++)
#define parse(i,s) for(int i=0;s[i];i++)

#define pub push_back
#define pob pop_back
#define puf push_front
#define pof pop_front
#define mak make_pair

#define y0 y0O0OO00OO0OO0OO0OOO00OO0OO0O0O000OO0
#define y1 y1II11II11III11I1III11II111IIII1II1I1
#define ws WSrAkIoi2333wSraKIoIWSraKiOi
#define left left_jTjTJtJtIoiiOiioIAuaU66666jtIOIau
#define hash whYusEthiSnamE_caNyoUusEothERnaMesliKeHSH

#define Mask(a) (1ll<<(a))
#define Maskx(a,x) ((a)<<(x))
#define Full(a) ((1ll<<(a))-1)
#define Bit(a,x) (((a)>>(x))&1)
#define all(a) (a).begin(),(a).end()
#define SZ(a) ((int)((a).size()))

typedef long long ll;
typedef long double lf;

const int Inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3fll;
const lf inF=11451419198101145141919810.1145141919810;
const lf pi=acosl(-1);
/* Source code starts here */

int n,a,b;
const int jt=1000000007;
int dp[5005][5005][2],qzh1[5005],qzh2[5005][5005];
void inline add(int &a,int b){a+=b;if(a>=jt)a-=jt;if(a<0)a+=jt;}

int main(){
	scanf("%d%d%d",&n,&a,&b);
	if(a<b)swap(a,b);
	dp[0][0][1]=1;
	loop(i,n+1){
		if(i)add(qzh1[i],qzh1[i-1]);
		add(dp[i][0][0],qzh1[i]);
		loop(j,i+1){
			if(i)add(qzh2[i-j][i],qzh2[i-j][i-1]);
			add(dp[i][j][0],qzh2[i-j][i]);
			if(j==a){
				add(dp[i][j][1],dp[i][j][0]);dp[i][j][0]=0;
				add(dp[i+1][j][1],dp[i][j][1]);
				add(dp[i+1][j][1],dp[i][j][1]);
				break;
			}
			add(dp[i+1][j+1][1],dp[i][j][0]);
			add(dp[i+1][j+1][1],dp[i][j][1]);
			add(qzh1[i+1],dp[i][j][1]);
			if(i+b<=n){
				add(qzh1[i+b],-dp[i][j][1]);
				if(j+b<=a)add(qzh2[i-j][i+b],dp[i][j][1]);
				else add(dp[i+b][a][1],dp[i][j][1]);
			}
		}
	}
	add(dp[n][a][1],dp[n][a][0]);
	printf("%d\n",dp[n][a][1]);
	return 0;
}