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
#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <cstring>
#include <bitset>
#include <functional>
#include <random>
#define REP(_i,_a,_n) for(int _i=_a;_i<=_n;++_i)
#define PER(_i,_a,_n) for(int _i=_n;_i>=_a;--_i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl '\n'
#define DB(_a) ({REP(_i,1,n) cout<<_a[_i]<<',';hr;})
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int P = 1e9+7, INF = 0x3f3f3f3f;
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
ll qpow(ll a,ll n) {ll r=1%P;for (a%=P;n;a=a*a%P,n>>=1)if(n&1)r=r*a%P;return r;}
ll inv(ll x){return x<=1?1:inv(P%x)*(P-P/x)%P;}
inline int rd() {int x=0;char p=getchar();while(p<'0'||p>'9')p=getchar();while(p>='0'&&p<='9')x=x*10+p-'0',p=getchar();return x;}
//head



const int N = 5e3+10;
int n,a,b,f[N],g[N][2];
void add(int &x, ll y) {x=(x+y)%P;}
int main() {
	scanf("%d%d%d", &n, &a, &b);
	if (a>b) swap(a,b);
	f[1] = f[2] = 1;
	REP(i,3,n) {
		f[i] = f[i-1];
		REP(j,1,i-a-1) add(f[i],f[j]);
	}
	REP(i,1,b-1) g[i][1] = f[i];
	REP(i,1,a-1) g[i][0] = 1;
	REP(i,a,b-1) REP(j,1,b-1-i) add(g[i+j][1],f[j]);
	REP(i,1,n) {
		REP(j,1,min(n-i,a-1)) add(g[i+j][0],g[i][1]);
		REP(j,1,min(n-i,b-1)) add(g[i+j][1],(ll)g[i][0]*f[j]);
	}
	int ans = (g[n][0]+g[n][1])%P;
	REP(i,a,b-1) REP(j,1,b-1-i) add(ans,(ll)g[n-i-j][0]*f[j]);
	ans = (qpow(2,n)-ans)%P;
	if (ans<0) ans += P;
	printf("%d\n", ans);
}
