fun main(args: Array<String>) {
    val (N, A, B, C, D) = readLine()!!.split(" ").map {it.toInt()}

    val MOD = 1e9.toLong() + 7L
    val MX = 1010
    val dp = Array (MX) { Array(MX) { ModInt(if (it == 0) 1L else 0L, MOD) } }
    val modComb = ModCombination(MX.toLong(), MOD)

    for (i in A..B) {
        for (j in 0..N) {
            if (j != 0) dp[i][j] += dp[i - 1][j]
            for (k in C..Math.min(N / i, D)) {
                if (j + i * k > N) break
                dp[i][j + i * k] += dp[i - 1][j] * modComb.calc(i.toLong(), k.toLong()) * modComb.get(N - j.toLong(), i * k.toLong())
            }
        }
    }

//    for (i in 0 .. B) {
//        println(dp[i].take(N + 1).map{it.value }.joinToString(" "))
//    }

    println(dp[B][N].value)
}

class ModInt (value: Long, val mod: Long) {
    init {
        if (mod <= 0) {
            throw IllegalArgumentException("ModInt cannot be created for non-positive modulus: $mod")
        }
    }

    val value = (value % mod + mod) % mod

    private fun assertSameMod(other: ModInt) {
        if (mod != other.mod) {
            throw IllegalArgumentException(
                "You cannot operate summation, subtraction and multiplication for ModInts with different moduli: $mod, ${other.mod}"
            )
        }
    }

    operator fun unaryMinus() = ModInt(mod - value, mod)

    operator fun plus(other: ModInt): ModInt {
        assertSameMod(other)

        return ModInt((value + other.value) % mod, mod)
    }

    operator fun plus(other: Long) = plus(ModInt(other, mod))

    operator fun minus(other: ModInt): ModInt {
        assertSameMod(other)

        return plus(-other)
    }

    operator fun minus(other: Long) = minus(ModInt(other, mod))

    operator fun times(other: ModInt): ModInt {
        assertSameMod(other)

        return ModInt((value * other.value) % mod, mod)
    }

    operator fun times(other: Long) = times(ModInt(other, mod))

    fun pow(k: Long): ModInt {
        var res = 1L
        var a = value
        var l = k

        while (l > 0) {
            if ((l and 1L) == 1L) {
                res = (res * a) % mod
            }

            a = a * a % mod
            l /= 2L
        }

        return ModInt(res, mod)
    }

    /**
     * Returns an inverse element of the value.
     * To ensure `m * m.inv() = 1`, the modulus should be prime, since it uses Fermat's little theorem.
     */
    fun inv() = pow(mod - 2)

    operator fun div(other: ModInt): ModInt {
        assertSameMod(other)
        if (other.value == 0L) {
            throw ArithmeticException()
        }

        return times(other.inv())
    }

    operator fun div(other: Long) = div(ModInt(other, mod))
}

class ModCombination(val n: Long, val mod: Long) {
    private val fact = Array(n.toInt() + 1) { ModInt(1, mod) }
    private val invfact = Array(n.toInt() + 1) { ModInt(1, mod) }

    init {
        for (i in 2..n.toInt()) {
            fact[i] = fact[i - 1] * i.toLong()
            invfact[i] = fact[i].inv()
        }
    }

    operator fun get(n: Long, m: Long): ModInt {
        if (m > n) {
            return ModInt(0, mod)
        }

        return fact[n.toInt()] * invfact[m.toInt()] * invfact[(n - m).toInt()]
    }

    fun calc(n: Long, m: Long): ModInt {
        return fact[(n * m).toInt()] * invfact[n.toInt()].pow(m) * invfact[m.toInt()]
    }
}


Measured memory_bytes: 145840