Problem:
Score : 500 points

Problem Statement

Consider sequences \{A_1,...,A_N\} of length N consisting of integers between 1 and K (inclusive).

There are K^N such sequences. Find the sum of \gcd(A_1, ..., A_N) over all of them.

Since this sum can be enormous, print the value modulo (10^9+7).

Here \gcd(A_1, ..., A_N) denotes the greatest common divisor of A_1, ..., A_N.

Constraints

2 \leq N \leq 10^5

1 \leq K \leq 10^5

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N K

Output

Print the sum of \gcd(A_1, ..., A_N) over all K^N sequences, modulo (10^9+7).

Sample Input 1

3 2

Sample Output 1

9

\gcd(1,1,1)+\gcd(1,1,2)+\gcd(1,2,1)+\gcd(1,2,2)
+\gcd(2,1,1)+\gcd(2,1,2)+\gcd(2,2,1)+\gcd(2,2,2)
=1+1+1+1+1+1+1+2=9

Thus, the answer is 9.

Sample Input 2

3 200

Sample Output 2

10813692

Sample Input 3

100000 100000

Sample Output 3

742202979

Be sure to print the sum modulo (10^9+7).

Solution in Kotlin (1.3.71) (judge verdict: Wrong Answer)

import kotlin.math.sqrt

fun main(args: Array<String>) = abc162e()

fun abc162e() {
    val (n, k) = readLine()!!.split(' ').map { it.toLong() }

    if (k == 1L) return println(1)

    val primes = genPrime(k) + 1
    var answer = 0L

    for (i in primes) {
        val pattern = k / i
        answer += (modPow(pattern, n) * if (i != 1L) i - 1 else i) % MOD
        answer %= MOD
    }

    println(answer)
}

private const val MOD = (1e9 + 7).toLong()

private fun divisors(n: Long): List<Long> {
    val divisors = mutableListOf<Long>()
    for (i in 1..sqrt(n.toDouble()).toLong()) if (n % i == 0L) divisors.add(i)
    return (divisors + n).distinct()
}

private fun modPow(n: Long, p: Long): Long {
    var x = n
    var y = p
    var result = 1L
    x %= MOD
    while (y > 0) {
        if (y % 2 == 1L)
            result = (result * x) % MOD
        y = y shr 1
        x = (x * x) % MOD
    }
    return result
}

private fun genPrime(max: Long): LongArray {
    val sqrt = Math.ceil(Math.sqrt(max.toDouble())).toLong()
    val primes = mutableListOf<Long>()

    var target = (2..max).toList()

    while (target.isNotEmpty() && target.first() <= sqrt) {
        val prime = target.first()
        primes.add(prime)
        target = target.filterNot { it % prime == 0L }
    }

    primes.addAll(target)

    return primes.toLongArray()
}