import java.util.*

fun main(args: Array<String>) {
    val (N, K) = readLine()!!.split(" ").map{it.toLong()}
    val sieveOfEratosthenes = SieveOfEratosthenes(K)

    val MOD = 1e9.toLong() + 7
    var res = ModInt(0L, MOD)
    val dp = Array(K.toInt() + 1) { ModInt(0L, MOD) }

    for (g in K.toInt() downTo 1) {
        dp[g] = ModInt(K / g, MOD).pow(N)

        for (t in 2 * g .. K.toInt() step g) {
            dp[g] -= dp[t]
        }

        res += dp[g] * g.toLong()
    }

    println(res.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 || n < 0 || m < 0) {
            return ModInt(0, mod)
        }

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

class SieveOfEratosthenes(n: Long) {
    private val isPrime = Array(n.toInt() + 1) { true }

    /**
     * A list of primes less than or equal to `n`.
     */
    val primes: List<Long>

    init {
        isPrime[0] = false
        isPrime[1] = false
        val primeList = ArrayList<Long>()

        for (i in 2..n.toInt()) {
            if (!isPrime[i]) {
                continue
            }

            primeList.add(i.toLong())
            for (j in i * 2 .. n.toInt() step i) {
                isPrime[j] = false
            }
        }

        primes = Collections.unmodifiableList(primeList)
    }

    /**
     * @return `true` if `i` is prime.
     */
    fun get(i: Long): Boolean {
        return isPrime[i.toInt()]
    }
}


Measured memory_bytes: 62032